Regex: ignoruj ​​rozróżnianie wielkości liter


316

Jak mogę sprawić, by następujące wyrażenie regularne ignorowało rozróżnianie wielkości liter? Powinien pasować do wszystkich prawidłowych znaków, ale ignorować, czy są one pisane małymi czy dużymi literami.

G[a-b].*

Po prostu
umieść

2
G [a-bA-B]. * Byłoby oczywiste w tym ogólnym przypadku, wrażliwość na wielkość liter zależy od platformy i nie dajesz platformy.
Joachim Isaksson,

16
Jeśli używasz Java, można określić to z klasą Wzór: Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);.
james.garriss,


Zauważ, że dla greping jest to po prostu dodanie -imodyfikatora. Np .: grep -rni regular_expressionaby wyszukać to „wyrażenie_ regularne” r'kursywnie, wielkość liter „i'nsensitive”, pokazując w wierszu numery „n”.
Gabriel Staples

Odpowiedzi:


444

Zakładając, że chcesz, aby całe wyrażenie regularne ignorowało wielkość liter, powinieneś poszukać iflagi . Obsługują go prawie wszystkie silniki regex:

/G[a-b].*/i

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

Sprawdź dokumentację swojego języka / platformy / narzędzia, aby dowiedzieć się, w jaki sposób określono tryby dopasowania.

Jeśli chcesz, aby tylko część wyrażenia regularnego nie uwzględniała wielkości liter (jak zakładano w mojej pierwotnej odpowiedzi), masz dwie opcje:

  1. Użyj modyfikatorów trybu (?i)i [opcjonalnie] (?-i):

    (?i)G[a-b](?-i).*
  2. Umieść wszystkie odmiany (tj. Małe i wielkie) w wyrażeniu regularnym - przydatne, jeśli modyfikatory trybu nie są obsługiwane:

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

Ostatnia uwaga: jeśli masz do czynienia ze znakami Unicode oprócz ASCII, sprawdź, czy Twój silnik regex obsługuje je poprawnie.


Znakomity! Działa dla: perl -pe 's / ^ utf-8 \? B \?. * $ // gi' Cancer.1631, dopasowując / zastępując ciąg „UTF-8? B?” w pliku Cancer.1631. To się nie udaje: perl -pe 's / ^ utf-8 \? B \?. * $ // g' Cancer.1631, z powodu niedopasowania wielkości liter.
Victoria Stuart

Ten post byłby o wiele jaśniejszy, gdyby nie był tak konkretnym przykładem. Na przykład, jeśli chcesz zignorować wielkość liter dla innego słowa, takiego jak „.txt” i „.TXT”. Patrząc na tę odpowiedź, wciąż nie jestem pewien, jak mógłbym to zrobić.
Kyle Bridenstine

Z jakiegoś powodu regex, który opublikowałeś nie działa w findrozszerzonym regexie. Na przykład find . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \)nie pokazuje żadnych folderów .. biały podobny reged find . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)bez modyfikatorów pokazuje prawidłowe foldery. Masz pomysł, dlaczego?
alpha_989

Tutaj próbuję znaleźć wszystkie foldery zaczynające się od znaków tylko [a-c]w bieżącym folderze .. aby zrobić więcej manipulacji ..
alpha_989

Szczerze mówiąc, umieściłem opcję 2 w głównej części odpowiedzi, ponieważ jest ona ogólna i działa ze wszystkimi silnikami wyrażeń regularnych.
Puterdo Borato,

154

Zależy od implementacji, ale chciałbym użyć

(?i)G[a-b].

ODMIANY:

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

Nowoczesne smaki wyrażeń regularnych pozwalają stosować modyfikatory tylko do części wyrażenia regularnego. Jeśli wstawisz modyfikator (? Im) w środku wyrażenia regularnego, wówczas modyfikator dotyczy tylko części wyrażenia regularnego po prawej stronie modyfikatora. Dzięki tym smakom możesz wyłączyć tryby, poprzedzając je znakiem minus (? -I).

Opis pochodzi ze strony: https://www.regular-expressions.info/modifiers.html


Jest to format modyfikujący silnik regex Search TortoiseHg.
mwolfe02

Czy możesz mi powiedzieć, jak można to osiągnąć w powłoce Linuxa (powiedzmy w egrep bez użycia przełącznika „-i”)?
Krishna Gupta

1
Wyjaśnienie, co (?i)robi i jak to zakończyć ( (?-i)) byłoby bardzo pomocne. Właśnie dlatego twoja odpowiedź ma 1/3 tyle głosów, co pytanie nr 1, a nie prawie tyle, ile wyjaśniają ten subtelny szczegół.
Gabriel Staples

55

wyrażenie regularne do sprawdzania poprawności „abc” ignorujące wielkość liter

(?i)(abc)

1
Działa doskonale z logcat Android Studio
Joe

Działa również w python
conner.xyz

47

iFlaga jest zwykle używany do sprawy niewrażliwości. Nie podajesz tutaj języka, ale prawdopodobnie będzie to coś w rodzaju /G[ab].*/ilub /(?i)G[ab].*/.


15

Dla kompletności chciałem dodać rozwiązanie dla wyrażeń regularnych w C ++ z Unicode:

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

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

1
Czy ktoś może mi wyjaśnić, dlaczego ten post został odrzucony? Akceptowane rozwiązanie wykorzystuje określony kod i ze względu na kompletność chciałem dodać rozwiązanie dla standardowych bibliotek języka c ++. Moim zdaniem wygenerowałem wartość dodaną do bardziej ogólnego pytania.
Frankenstein,

5

Jak dowiedziałem się z tego podobnego postu ( ignoruj ​​w AWK ), na starych wersjach awk (takich jak waniliowy Mac OS X), może być konieczne użycie 'tolower($0) ~ /pattern/'.

IGNORECASEalbo (?i)albo /pattern/ialbo będzie generować błąd lub powrócić prawdziwe dla każdej linii.


2

DO#

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

w szczególności: options: RegexOptions.IgnoreCase


1

[gG] [aAbB]. * prawdopodobnie prawdopodobnie upraszcza rozwiązanie, jeśli wzór nie jest zbyt skomplikowany ani długi.


chciałbyś wiedzieć, dlaczego ta odpowiedź jest niewłaściwa dla danego pytania?
alpha_989

Masz to w swojej odpowiedzi „nie jest zbyt skomplikowane ani zbyt długie”
reggaeguitar

To właściwie jedyne rozwiązanie, które zadziałało w mojej sprawie. Wygląda również na najbardziej ogólne rozwiązanie, które powinno działać wszędzie. Wszystkie pozostałe odpowiedzi wydają się być bardzo specyficzne dla konkretnych implementacji wyrażeń regularnych.
Puterdo Borato,

1

Dodatek do już zaakceptowanych odpowiedzi:

Wykorzystanie grep:

Zauważ, że dla greping jest to po prostu dodanie -imodyfikatora. Np .: grep -rni regular_expressionaby wyszukać to „wyrażenie_ regularne” r'kursywnie, wielkość liter „i'nsensitive”, pokazując w wierszu numery „n”.

Oto świetne narzędzie do weryfikacji wyrażeń regularnych: https://regex101.com/

Np .: Zobacz wyrażenie i objaśnienie na tym obrazie.

wprowadź opis zdjęcia tutaj

Bibliografia:


0

W Javie Regexkonstruktor ma

Regex(String pattern, RegexOption option)

Aby zignorować przypadki, użyj

option = RegexOption.IGNORE_CASE

0

Możesz ćwiczyć Regex w Visual Studio i Visual Studio Code za pomocą funkcji znajdź / zamień.

Musisz wybrać Dopasuj wielkość liter i Wyrażenia regularne dla wyrażeń regularnych z wielkością liter. W przeciwnym razie [AZ] nie będzie działać. Wprowadź opis obrazu tutaj

Społeczność Visual Studio 2019


-2

Możesz również poprowadzić początkowy ciąg znaków, który będziesz sprawdzać pod kątem dopasowania wzorca, do małych liter. I używając we wzorze odpowiednio małych liter.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.