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


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, проверьте, правильно ли поддерживает их ваш движок регулярных выражений.


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


Это формат модификатора для поискового регулярного выражения TortoiseHg.
mwolfe02

Не могли бы вы рассказать мне, как этого можно добиться в оболочке Linux (скажем, в egrep без использования ключа "-i")?
Кришна Гупта

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

55

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

(?i)(abc)

1
Прекрасно работает с Android Studio LogCat
Джо

Работает и в Python
conner.xyz

47

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


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будет либо генерировать ошибку или возвращает истину для каждой строки.


2

C #

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

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


1

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


Хотелось бы узнать, почему этот ответ является неправильным для данного вопроса?
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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.