Чи можете ви зробити лише частину невідчутливої ​​до регексу?


100

Я бачив безліч прикладів того, щоб зробити цілком регулярні висловлювання нечутливими. Що мені цікаво - це лише те, що частина виразу є невідчутною до регістру.

Наприклад, скажімо, у мене є такий рядок:

fooFOOfOoFoOBARBARbarbarbAr

Що робити, якщо я хочу відповідати всім випадкам "foo" незалежно від випадку, але я хочу відповідати лише великим регістром "BAR"?

Ідеальним рішенням буде щось, що працює на смаках регулярних виразів, але я також зацікавлений у тому, щоб слухати конкретні мови (спасибі Espo )

Редагувати

Посилання Espo було дуже корисним. Там є хороший приклад про вмикання та вимкнення модифікаторів у виразі.

Для мого надуманого прикладу я можу зробити щось подібне:

(?i)foo*(?-i)|BAR

що робить матч нечутливим лише до нижньої частини матчу.

Це, здається, працює в більшості програм regex, крім Javascript, Python та деяких інших (як згадував Espo).

Великі, про які мені було цікаво (Perl, PHP, .NET), всі підтримують зміни в режимі вбудованого режиму.


Це запитання було додано до поширених запитань про регулярне вираження стека в розділі "Модифікатори".
aliteralmind

Відповіді:


88

Perl дозволяє вам стати частиною вашого невідчутливого до регістру висловлювання за допомогою модифікатора шаблону (? I :).

Сучасні аромати regex дозволяють застосовувати модифікатори лише до частини регулярного виразу. Якщо ви вставите модифікатор (? Ism) в середину регулярного вираження, модифікатор застосовується лише до тієї частини регексу, що знаходиться праворуч від модифікатора. Ви можете вимкнути режими, передуючи їм зі знаком мінус. Усі режими після знаку мінус будуть вимкнено. Напр. (? I-sm) вмикає нечутливість регістру та вимикає як однолінійний, так і багатолінійний режим.

Не всі аромати регулярного вираження це підтверджують. JavaScript і Python застосовують всі модифікатори режимів до всього регулярного виразу. Вони не підтримують синтаксис (? -Ismx), оскільки вимикати опцію безглуздо, коли модифікатори режимів застосовуються до всіх регулярних виразів. Усі параметри вимкнено за замовчуванням.

Ви можете швидко перевірити, як аромат регулярного вибору ви використовуєте з модифікаторами режиму роботи. Регекс (? I) te (? - i) st повинен відповідати тесту та TEst, але не teST або TEST.

Джерело


6

Якою мовою ви користуєтесь? Стандартним способом зробити це буде щось на кшталт / ([Ff] [Oo] {2} | BAR) / з урахуванням чутливості регістру, але в Java, наприклад, є модифікатор чутливості регістру (? I), який робить все символи праворуч від нього нечутливі і (? -i), що змушує чутливість. Приклад модифікатора регулярного вираження Java ви можете знайти тут .


+1 Навіщо турбуватися, щоб зробити це нечутливим, якщо ви можете зіставити обидва випадки
Нона Урбіз

11
@NonaUrbiz: Тому що вираз (?i)foobarлегше читається, ніж[Ff][Oo]{2}[Bb][Aa][Rr]
Танатос,

1
І тому , що вона може рости шлях набагато більш волохаті і складним.
Чоп

6

На жаль, синтаксис для невідповідності регістру не відповідає. У .NET ви можете використовувати прапор RegexOptions.IgnoreCase або модифікатор ? I


4

Ви можете використовувати

(?:F|f)(?:O|o)(?:O|o)

У дужках в .Net означає, що це не захоплення, а просто використовується для групування термінів | (або) заява.


26
Хіба "[fF] [oO] [oO]" краща альтернатива? Наприклад, ви можете навіть піти так далеко, як "[fF] [oO] \ {2}" ;-)
Томалак

4

Це правда, можна покластися на вбудовані модифікатори, як описано в Увімкнення та вимкнення режимів лише для частини регулярного виразу :

Регулярний вираз (?i)te(?-i)stмає відповідати тест і TEst, але не teSTабо TEST.

Однак трохи більше підтримується функція - група (?i:...)вбудованих модифікаторів (див. Проміжки модифікаторів ). Синтаксис є (?i:, тоді шаблон, який потрібно зробити cas-нечутливим, а потім a ).

(?i:foo)|BAR

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

Приклад використовує на різних мовах (загортання відповідностей кутовими дужками):

Не підтримується в , , , std::regex, , .

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