Можете ли вы сделать часть регулярного выражения без учета регистра?

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

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

fooFOOfOoFoOBARBARbarbarbAr

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

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

Edit

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

Источник

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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