Regex, не чутливий до регістру, без використання перерахування RegexOptions


76

Чи можна виконати збіг без урахування регістру в C #, використовуючи клас Regex, не встановлюючи прапор RegexOptions.IgnoreCase?

Що я хотів би мати змогу зробити, це в межах регулярного виразу визначити, чи хочу я, щоб операція збігу виконувалась з урахуванням регістру.

Я хотів би, щоб цей регулярний вираз,, taylorвідповідав наступним значенням:

  • Тейлор
  • Тейлор
  • taYloR

Відповіді:


108

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

(?i)taylor відповідає всім введеним мною введенням, не встановлюючи прапор RegexOptions.IgnoreCase.

Для примусової чутливості до регістру я можу це зробити (?-i)taylor.

Схоже, інші варіанти включають:

  • i, не враховує регістр
  • s, однорядковий режим
  • m, багаторядковий режим
  • x, режим вільного інтервалу

59

Як ви вже з'ясували, (?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'

27

Як каже spoon16, це так (?i). MSDN має список варіантів регулярних виразів, який включає приклад використання відповідності без урахування регістру лише для частини відповідності:

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

Тут "t" відповідає регістру, а решта - з урахуванням регістру. Якщо ви не вказали підвираз, параметр встановлюється для решти групи, що включає.

Отже, для вашого прикладу ви можете мати:

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

Це відповідало б "Мене звати Тейлор", але не "МОЄ ІМ'Я Тейлор".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.