Нечувствительное к регистру Regex без использования перечисления RegexOptions

Можно ли сделать нечувствительное к регистру совпадение в С# с использованием класса Regex без установки флага RegexOptions.IgnoreCase?

То, что я хотел бы сделать, - это внутри самого регулярного выражения определить, нужно ли делать операцию совпадения без учета регистра.

Я хотел бы, чтобы это регулярное выражение taylor соответствовало следующим значениям:

  • Тэйлор
  • Тэйлора
  • Тейлором

Ответ 1

Документация MSDN

(?i)taylor соответствует всем указанным входам без необходимости устанавливать флаг RegexOptions.IgnoreCase.

Чтобы усилить чувствительность к регистру, я могу сделать (?-i)taylor.

Похоже, что другие варианты:

  • i, нечувствительный к регистру
  • s, режим с одной строкой
  • m, многострочный режим
  • x, режим свободного пробега

Ответ 2

Как вы уже выяснили, (?i) является линейным эквивалентом RegexOptions.IgnoreCase.

Просто FYI, есть несколько трюков, которые вы можете сделать с ним:

Regex:
    a(?i)bc
Matches:
    a       # match the character 'a'
    (?i)    # enable case insensitive matching
    b       # match the character 'b' or 'B'
    c       # match the character 'c' or 'C'

Regex:
    a(?i)b(?-i)c
Matches:
    a        # match the character 'a'
    (?i)     # enable case insensitive matching
    b        # match the character 'b' or 'B'
    (?-i)    # disable case insensitive matching
    c        # match the character 'c'

Regex:    
    a(?i:b)c
Matches:
    a       # match the character 'a'
    (?i:    # start non-capture group 1 and enable case insensitive matching
      b     #   match the character 'b' or 'B'
    )       # end non-capture group 1
    c       # match the character 'c'

И вы можете даже комбинировать такие флаги: a(?mi-s)bc Значение:

a          # match the character 'a'
(?mi-s)    # enable multi-line option, case insensitive matching and disable dot-all option
b          # match the character 'b' or 'B'
c          # match the character 'c' or 'C'

Ответ 3

Как говорит ложка16, она (?i). MSDN имеет список параметров регулярного выражения, который включает пример использования нечувствительного к регистру соответствия только для части соответствия:

 string pattern = @"\b(?i:t)he\w*\b";

Здесь "t" сопоставляется без учета регистра, но остальное зависит от регистра. Если вы не укажете подвыражение, параметр будет установлен для остальной части охватывающей группы.

Итак, для вашего примера вы могли бы:

string pattern = @"My name is (?i:taylor).";

Это будет соответствовать "Мое имя - TAYlor", но не "MY NAME IS taylor".