Регулярное выражение: игнорировать чувствительность к регистру
316
Как я могу заставить следующее регулярное выражение игнорировать чувствительность к регистру? Он должен соответствовать всем правильным символам, но игнорировать, являются ли они строчными или прописными.
Обратите внимание, что для grepэтого просто добавление -iмодификатора. Пример: grep -rni regular_expressionискать это 'регулярное_выражение' 'r'курсивно, регистр' i 'нечувствителен, показывая строку' n 'чисел в результате.
Габриэль Стейплз
Ответы:
444
Предполагая, что вы хотите, чтобы все регулярные выражения игнорировали регистр, вы должны искать iфлаг . Почти все движки регулярных выражений поддерживают это:
/G[a-b].*/i
string.match("G[a-b].*","i")
Проверьте документацию для вашего языка / платформы / инструмента, чтобы узнать, как указаны соответствующие режимы.
Если вы хотите, чтобы только часть регулярного выражения была без учета регистра (как предполагал мой первоначальный ответ), то у вас есть два варианта:
Используйте модификаторы режима (?i)и [опционально] (?-i):
(?i)G[a-b](?-i).*
Поместите все варианты (то есть строчные и прописные) в регулярное выражение - полезно, если модификаторы режима не поддерживаются:
[gG][a-bA-B].*
И последнее замечание: если вы имеете дело с символами Юникода, кроме ASCII, проверьте, правильно ли поддерживает их ваш движок регулярных выражений.
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).
Это формат модификатора для поискового регулярного выражения TortoiseHg.
mwolfe02
Не могли бы вы рассказать мне, как этого можно добиться в оболочке Linux (скажем, в egrep без использования ключа "-i")?
Кришна Гупта
1
Объяснение того, что (?i)делает и как закончить это ( (?-i)) было бы действительно полезно. Это просто, почему ваш ответ имеет 1/3 столько же голосов, сколько вопрос № 1, чем почти столько, сколько они объясняют эту тонкую деталь.
Габриэль Стейплз
55
регулярное выражение для проверки 'abc', игнорирующее регистр
Может кто-нибудь объяснить мне, почему этот пост был отклонен? В принятом решении используется конкретный код, и для полноты картины я хотел добавить решение для стандартных библиотек языка с ++. По моему мнению, я добавил ценность к более общему вопросу.
Франкенштейн
5
Как я обнаружил из этого аналогичного поста ( игнорируется в AWK ), в старых версиях awk (например, в vanilla Mac OS X) вам может понадобиться использовать 'tolower($0) ~ /pattern/'.
IGNORECASEили (?i)или /pattern/iбудет либо генерировать ошибку или возвращает истину для каждой строки.
Хотелось бы узнать, почему этот ответ является неправильным для данного вопроса?
alpha_989
У вас есть это в вашем ответе "не слишком сложно или долго"
reggaeguitar
На самом деле это единственное решение, которое сработало для моего случая. Также это выглядит как наиболее общее решение, которое должно работать везде. Все остальные ответы кажутся очень специфичными для конкретных реализаций регулярных выражений.
Puterdo Borato
1
Дополнение к уже принятым ответам:
Grep использование:
Обратите внимание, что для grepэтого просто добавление -iмодификатора. Пример: grep -rni regular_expressionискать это 'регулярное_выражение' 'r'курсивно, регистр' i 'нечувствителен, показывая строку' n 'чисел в результате.
Кроме того, вот отличный инструмент для проверки регулярных выражений: https://regex101.com/
Пример: см. Выражение и объяснение на этом изображении.
Вы можете практиковать Regex в Visual Studio и Visual Studio Code, используя поиск / замену.
Для выражений регулярных выражений с регистром вам нужно выбрать совпадения с регистром и регулярные выражения. Еще [AZ] не будет работать. Введите описание изображения здесь
Вы также можете перевести исходную строку, которую вы собираетесь проверить на соответствие шаблону, в нижний регистр. И используя в своем шаблоне символы нижнего регистра соответственно.
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
.grep
этого просто добавление-i
модификатора. Пример:grep -rni regular_expression
искать это 'регулярное_выражение' 'r'курсивно, регистр' i 'нечувствителен, показывая строку' n 'чисел в результате.Ответы:
Предполагая, что вы хотите, чтобы все регулярные выражения игнорировали регистр, вы должны искать
i
флаг . Почти все движки регулярных выражений поддерживают это:Проверьте документацию для вашего языка / платформы / инструмента, чтобы узнать, как указаны соответствующие режимы.
Если вы хотите, чтобы только часть регулярного выражения была без учета регистра (как предполагал мой первоначальный ответ), то у вас есть два варианта:
Используйте модификаторы режима
(?i)
и [опционально](?-i)
:Поместите все варианты (то есть строчные и прописные) в регулярное выражение - полезно, если модификаторы режима не поддерживаются:
И последнее замечание: если вы имеете дело с символами Юникода, кроме ASCII, проверьте, правильно ли поддерживает их ваш движок регулярных выражений.
источник
find
расширенном регулярном выражении ... напримерfind . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \)
, не отображает никаких папок ... белый - аналогичное правилоfind . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)
без модификаторов показывает правильные папки. Есть идеи почему?[a-c]
в текущей папке ... чтобы сделать еще какие-то манипуляции ..Зависит от реализации, но я бы использовал
ВАРИАЦИИ:
Современные регулярные выражения позволяют применять модификаторы только к части регулярного выражения. Если вы вставите модификатор (? Im) в середину регулярного выражения, тогда модификатор применяется только к части регулярного выражения справа от модификатора. С этими вариантами вы можете отключить режимы, поставив перед ними знак минус (? -I).
Описание со страницы: https://www.regular-expressions.info/modifiers.html
источник
(?i)
делает и как закончить это ((?-i)
) было бы действительно полезно. Это просто, почему ваш ответ имеет 1/3 столько же голосов, сколько вопрос № 1, чем почти столько, сколько они объясняют эту тонкую деталь.регулярное выражение для проверки 'abc', игнорирующее регистр
источник
i
Флаг обычно используется для случая нечувствительности. Вы не говорите здесь, но, вероятно, это будет что-то вроде/G[ab].*/i
или/(?i)G[ab].*/
.источник
Для полноты картины я хотел добавить решение для регулярных выражений в C ++ с Unicode:
источник
Как я обнаружил из этого аналогичного поста ( игнорируется в AWK ), в старых версиях awk (например, в vanilla Mac OS X) вам может понадобиться использовать
'tolower($0) ~ /pattern/'
.IGNORECASE
или(?i)
или/pattern/i
будет либо генерировать ошибку или возвращает истину для каждой строки.источник
C #
в частности: options: RegexOptions.IgnoreCase
источник
[gG] [aAbB]. * вероятно, упрощает решение, если шаблон не слишком сложный или длинный.
источник
Дополнение к уже принятым ответам:
Grep использование:
Обратите внимание, что для
grep
этого просто добавление-i
модификатора. Пример:grep -rni regular_expression
искать это 'регулярное_выражение' 'r'курсивно, регистр' i 'нечувствителен, показывая строку' n 'чисел в результате.Кроме того, вот отличный инструмент для проверки регулярных выражений: https://regex101.com/
Пример: см. Выражение и объяснение на этом изображении.
Ссылки:
man grep
)источник
В Java
Regex
конструктор имеетЧтобы игнорировать случаи, используйте
источник
Вы можете практиковать Regex в Visual Studio и Visual Studio Code, используя поиск / замену.
Для выражений регулярных выражений с регистром вам нужно выбрать совпадения с регистром и регулярные выражения. Еще [AZ] не будет работать. Введите описание изображения здесь
источник
Вы также можете перевести исходную строку, которую вы собираетесь проверить на соответствие шаблону, в нижний регистр. И используя в своем шаблоне символы нижнего регистра соответственно.
источник