2012-03-11 2 views
155

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

G[a-b].* 
+0

Просто выполните как верхний регистр, так и строчный регистр, включенный в регулярное выражение или преобразованный в верхний регистр, прежде чем выполнять регулярное выражение, соответствующее –

+0

G [a-bA-B].* будет очевидным в этом общем случае, чувствительность к регистру зависит от платформы afaik, и вы не даете платформу. –

+8

Если вы используете Java, вы можете указать это с помощью класса Pattern: 'Pattern pattern = Pattern.compile (regex, Pattern.CASE_INSENSITIVE);'. –

ответ

229

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

/G[a-b].*/i 

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

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

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

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

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

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

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

+0

Блестящий! Работает для: perl -pe 's/^ utf-8 \? B \?. * $ // gi' Cancer.1631, сопоставление/замена строки "UTF-8? B?" в файле Cancer.1631. Это не удается: perl -pe's/^ utf-8 \? B \?. * $ // g 'Cancer.1631, из-за несоответствия случая. –

43

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

78

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

(?i)G[a-b]. 
+0

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

+0

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

+0

Это отлично работает в C# –

13

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

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

if (std::tr1::regex_match(szString, pattern)) 
{ 
... 
} 
+1

Может кто-нибудь уточнить мне, почему этот пост был downvoted? В принятом решении используется конкретный код, и для полноты я хотел добавить решение для стандартных библиотек языка C++. По-моему, я добавил добавленную стоимость к более общему вопросу. – Frankenstein

0

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

3

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

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

26

регулярное выражение для Validate 'ABC', игнорируя при чувствительной

(?i)(abc) 
+1

Это работает особенно хорошо, если вы используете Java ... – LAK

+0

Работает отлично с Android Studio logcat – Joe

-1

[Гг] [Аабб]. * Вероятно Simples решение, если шаблон не слишком сложно или долго.

+0

с удовольствием узнает, почему этот ответ неверен для данного вопроса? –

Смежные вопросы