Regex: ігнорування чутливості до регістру


316

Як я можу зробити так, щоб регулярний вигляд регістру не враховував регістр? Він повинен відповідати всім правильним символам, але ігнорувати, чи є вони малими чи великими.

G[a-b].*

Просто
додайте

2
G [a-bA-B]. * Було б очевидним у цьому загальному випадку, чутливість регістру залежить від платформи afaik, і ви не надаєте платформу.
Йоахім Ісакссон

16
Якщо ви використовуєте Java, ви можете вказати це з класом Pattern: Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);.
james.garriss

Більше варіантів Java тут: blogs.oracle.com/xuemingshen/entry/…
james.garriss

Зауважте, що для greping це просто додавання -iмодифікатора. Наприклад: grep -rni regular_expressionдля пошуку цього "regular_expression" 'r'ecursively, регістр' i 'чутливий, показ результату' n'umbers.
Габріель Стейплз

Відповіді:


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].*

Останнє зауваження: якщо ви маєте справу з символами Unicode, окрім ASCII, перевірте, чи правильно їх підтримує ваш регекс-движок.


Блискуче! Працює для: perl -pe 's / ^ utf-8 \? B \?. * $ // gi' Cancer.1631, відповідає / замінює рядок "UTF-8? B?" у файлі Рак.1631. Це не вдається: perl -pe 's / ^ utf-8 \? B \?. * $ // g' Cancer.1631, через невідповідність випадку.
Вікторія Стюарт

Цей пост був би набагато зрозумілішим, якби не такий конкретний приклад. Що робити, якщо ви хочете ігнорувати регістр для іншого слова, такого як ".txt" та ".TXT". З погляду на цю відповідь я все ще не впевнений, як я міг це зробити.
Кайл Бріденстін

Чомусь розміщений вами регулярний вираз не працює в findрозширеному регексі .. наприклад find . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \), не відображається жодна папка .. біла аналогічна reged find . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)без модифікаторів не відображає правильних папок. Будь-яка ідея чому?
alpha_989

Тут я намагаюся знайти всі папки, починаючи лише з символів [a-c]у поточній папці .. щоб зробити ще кілька маніпуляцій ..
alpha_989

Чесно кажучи, я б поставив варіант 2 у головній частині відповіді, оскільки він є загальним і працює з усіма двигунами регулярного генерування.
Путердо Борато

154

Залежить від реалізації, але я б користувався

(?i)G[a-b].

ВАРІАЦІЇ:

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

Сучасні аромати regex дозволяють застосовувати модифікатори лише до частини регулярного виразу. Якщо ви вставите модифікатор (? 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
Joe

Працює і в 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
Хтось може мені уточнити, чому цю посаду було скасовано? У прийнятому рішенні використовується специфічний код, а для повноти я хотів додати рішення для стандартних бібліотек мови c ++. На мою думку, я створив додаткову цінність до більш загального питання.
Франкенштейн

5

Як я з’ясував із цього подібного допису ( ignorecase в 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)

конкретно: параметри: RegexOptions.IgnoreCase


1

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


хотілося б знати, чому ця відповідь неправильна для даного питання?
alpha_989

Ви маєте це у своїй відповіді "не надто складно чи довго"
reggaeguitar

Це насправді єдине рішення, яке працювало на мою справу. Крім того, це схоже на найбільш загальне рішення, яке повинно працювати всюди. Усі інші відповіді здаються дуже специфічними для конкретних реалізацій регулярних виразів.
Путердо Борато

1

Доповнення до вже прийнятих відповідей:

Використання грепу:

Зауважте, що для greping це просто додавання -iмодифікатора. Наприклад: grep -rni regular_expressionдля пошуку цього "regular_expression" 'r'ecursively, регістр' i 'чутливий, показ результату' n'umbers.

Також ось чудовий інструмент для перевірки регулярних виразів: 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.