Регулярное выражение: игнорировать чувствительность к регистру

316

Как я могу заставить следующее регулярное выражение игнорировать чувствительность к регистру? Он должен соответствовать всем правильным символам, но игнорировать, являются ли они строчными или прописными.

G[a-b].*
брат
источник
Просто включите прописные и строчные буквы в регулярное выражение или преобразуйте в верхний регистр, прежде чем сопоставлять регулярные выражения
Chetter Hummin
2
G [a-bA-B]. * Будет очевидным в этом общем случае, чувствительность к регистру зависит от платформы, и вы не предоставляете платформу.
Иоахим Исакссон
16
Если вы используете Java, вы можете указать это с классом Pattern: Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);.
james.garriss
Дополнительные параметры Java здесь: blogs.oracle.com/xuemingshen/entry/…
james.garriss
Обратите внимание, что для grepэтого просто добавление -iмодификатора. Пример: grep -rni regular_expressionискать это 'регулярное_выражение' 'r'курсивно, регистр' i 'нечувствителен, показывая строку' n 'чисел в результате.
Габриэль Стейплз

Ответы:

444

Предполагая, что вы хотите, чтобы все регулярные выражения игнорировали регистр, вы должны искать iфлаг . Почти все движки регулярных выражений поддерживают это:

/G[a-b].*/i

string.match("G[a-b].*", "i")

Проверьте документацию для вашего языка / платформы / инструмента, чтобы узнать, как указаны соответствующие режимы.

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

  1. Используйте модификаторы режима (?i)и [опционально] (?-i):

    (?i)G[a-b](?-i).*
  2. Поместите все варианты (то есть строчные и прописные) в регулярное выражение - полезно, если модификаторы режима не поддерживаются:

    [gG][a-bA-B].*

И последнее замечание: если вы имеете дело с символами Юникода, кроме ASCII, проверьте, правильно ли поддерживает их ваш движок регулярных выражений.

мин mgibsonbr
источник
Brilliant! Работает для: perl -pe 's / ^ utf-8 \? B \?. * $ // gi' Cancer.1631, сопоставляя / заменяя строку "UTF-8? B?" в файле Cancer.1631. Это терпит неудачу: perl -pe 's / ^ utf-8 \? B \?. * $ // g' Cancer.1631, из-за несоответствия регистра.
Виктория Стюарт
Этот пост был бы намного понятнее, если бы не было такого конкретного примера. Например, если вы хотите игнорировать регистр для другого слова, такого как «.txt» и «.TXT». Глядя на этот ответ, я все еще не уверен, как я мог это сделать.
Кайл Бриденстайн
По какой-то причине опубликованное вами регулярное выражение не работает в findрасширенном регулярном выражении ... например find . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \), не отображает никаких папок ... белый - аналогичное правило find . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)без модификаторов показывает правильные папки. Есть идеи почему?
alpha_989
Здесь я пытаюсь найти все папки, начинающиеся с символов, только [a-c]в текущей папке ... чтобы сделать еще какие-то манипуляции ..
alpha_989
Честно говоря, я бы поставил вариант 2 в основной части ответа, поскольку он является общим и работает со всеми движками регулярных выражений.
Puterdo Borato
155

Зависит от реализации, но я бы использовал

(?i)G[a-b].

ВАРИАЦИИ:

(?i) case-insensitive mode ON    
(?-i) case-insensitive mode OFF

Современные регулярные выражения позволяют применять модификаторы только к части регулярного выражения. Если вы вставите модификатор (? Im) в середину регулярного выражения, тогда модификатор применяется только к части регулярного выражения справа от модификатора. С этими вариантами вы можете отключить режимы, поставив перед ними знак минус (? -I).

Описание со страницы: https://www.regular-expressions.info/modifiers.html

elrado
источник
Это формат модификатора для поискового регулярного выражения TortoiseHg.
mwolfe02
Не могли бы вы рассказать мне, как этого можно добиться в оболочке Linux (скажем, в egrep без использования ключа "-i")?
Кришна Гупта
1
Объяснение того, что (?i)делает и как закончить это ( (?-i)) было бы действительно полезно. Это просто, почему ваш ответ имеет 1/3 столько же голосов, сколько вопрос № 1, чем почти столько, сколько они объясняют эту тонкую деталь.
Габриэль Стейплз
55

регулярное выражение для проверки 'abc', игнорирующее регистр

(?i)(abc)
Ravinath
источник
1
Прекрасно работает с Android Studio LogCat
Джо
Работает и в Python
conner.xyz
47

iФлаг обычно используется для случая нечувствительности. Вы не говорите здесь, но, вероятно, это будет что-то вроде /G[ab].*/iили /(?i)G[ab].*/.

chooban
источник
15

Для полноты картины я хотел добавить решение для регулярных выражений в C ++ с Unicode:

std::tr1::wregex pattern(szPattern, std::tr1::regex_constants::icase);

if (std::tr1::regex_match(szString, pattern))
{
...
}
Франкенштейн
источник
1
Может кто-нибудь объяснить мне, почему этот пост был отклонен? В принятом решении используется конкретный код, и для полноты картины я хотел добавить решение для стандартных библиотек языка с ++. По моему мнению, я добавил ценность к более общему вопросу.
Франкенштейн
5

Как я обнаружил из этого аналогичного поста ( игнорируется в AWK ), в старых версиях awk (например, в vanilla Mac OS X) вам может понадобиться использовать 'tolower($0) ~ /pattern/'.

IGNORECASEили (?i)или /pattern/iбудет либо генерировать ошибку или возвращает истину для каждой строки.

senortim
источник
2

C #

using System.Text.RegularExpressions;
...    
Regex.Match(
    input: "Check This String",
    pattern: "Regex Pattern",
    options: RegexOptions.IgnoreCase)

в частности: options: RegexOptions.IgnoreCase

DonkeyKong
источник
1

[gG] [aAbB]. * вероятно, упрощает решение, если шаблон не слишком сложный или длинный.

alpha_989
источник
Хотелось бы узнать, почему этот ответ является неправильным для данного вопроса?
alpha_989
У вас есть это в вашем ответе "не слишком сложно или долго"
reggaeguitar
На самом деле это единственное решение, которое сработало для моего случая. Также это выглядит как наиболее общее решение, которое должно работать везде. Все остальные ответы кажутся очень специфичными для конкретных реализаций регулярных выражений.
Puterdo Borato
1

Дополнение к уже принятым ответам:

Grep использование:

Обратите внимание, что для grepэтого просто добавление -iмодификатора. Пример: grep -rni regular_expressionискать это 'регулярное_выражение' 'r'курсивно, регистр' i 'нечувствителен, показывая строку' n 'чисел в результате.

Кроме того, вот отличный инструмент для проверки регулярных выражений: https://regex101.com/

Пример: см. Выражение и объяснение на этом изображении.

введите описание изображения здесь

Ссылки:

Габриэль Стейплс
источник
0

В Java Regexконструктор имеет

Regex(String pattern, RegexOption option)

Чтобы игнорировать случаи, используйте

option = RegexOption.IGNORE_CASE
Азиз
источник
0

Вы можете практиковать Regex в Visual Studio и Visual Studio Code, используя поиск / замену.

Для выражений регулярных выражений с регистром вам нужно выбрать совпадения с регистром и регулярные выражения. Еще [AZ] не будет работать. Введите описание изображения здесь

Visual Studio 2019 Сообщество

Дэвид Морроу
источник
-2

Вы также можете перевести исходную строку, которую вы собираетесь проверить на соответствие шаблону, в нижний регистр. И используя в своем шаблоне символы нижнего регистра соответственно.

Александр Дробышевский
источник