Можете ли вы сделать только часть регулярного выражения без учета регистра? - PullRequest
92 голосов
/ 04 сентября 2008

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

Например, допустим, у меня есть такая строка:

fooFOOfOoFoOBARBARbarbarbAr

Что если я хочу сопоставить все вхождения "foo" независимо от регистра, но я хочу сопоставить только прописные буквы "BAR"?

Идеальным решением было бы то, что работает с различными типами регулярных выражений, но я также заинтересован в том, чтобы услышать и языковые (спасибо Espo )

Редактировать

Ссылка, предоставленная Espo, была очень полезной. Там есть хороший пример включения и выключения модификаторов в выражении.

Для моего надуманного примера я могу сделать что-то вроде этого:

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

, что делает регистр нечувствительным к регистру только для части foo матча.

Это, похоже, работало в большинстве реализаций регулярных выражений, кроме Javascript, Python и некоторых других (как упоминал Эспо).

Большие из них, о которых мне было интересно (Perl, PHP, .NET), все поддерживают изменения в встроенном режиме.

Ответы [ 4 ]

82 голосов
/ 04 сентября 2008

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

Современные разновидности регулярных выражений позволяют применять модификаторы только к части регулярного выражения. Если вы вставите модификатор (? Ism) в середине регулярного выражения, этот модификатор применяется только к части регулярного выражения справа от модификатора. Вы можете отключить режимы, поставив перед ними знак минус. Все режимы после знака минус будут отключены. Например. (? i-sm) включает нечувствительность к регистру и отключает как однострочный, так и многострочный режим.

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

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

Источник

6 голосов
/ 04 сентября 2008

К сожалению, синтаксис сопоставления без учета регистра не распространен. В .NET вы можете использовать флаг RegexOptions.IgnoreCase или ? I модификатор

6 голосов
/ 04 сентября 2008

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

4 голосов
/ 04 сентября 2008

Вы можете использовать

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

Знак?: В скобках в .Net означает, что он не захватывает, а просто используется для группировки терминов | (или) заявление.

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