Regex без учета регистра без использования перечисления RegexOptions - PullRequest
75 голосов
/ 13 марта 2010

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

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

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

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

Ответы [ 3 ]

105 голосов
/ 13 марта 2010

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

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

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

Похоже, другие опции включают в себя:

  • i, без учета регистра
  • s, однострочный режим
  • m, многострочный режим
  • x, свободный интервал
58 голосов
/ 13 марта 2010

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

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

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'
26 голосов
/ 13 марта 2010

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

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

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

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

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

Это будет соответствовать «Меня зовут Тейлор», но не «Мое имя - Тейлор».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...