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].*
brat
źródło
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,
Więcej opcji Java tutaj: blogs.oracle.com/xuemingshen/entry/…
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.

mgibsonbr
źródło
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

elrado
źródło
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)
Ravinath
źródło
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].*/.

chooban
źródło
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))
{
...
}
Frankenstein
źródło
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.

senortim
źródło
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

DonkeyKong
źródło
1

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

alpha_989
źródło
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:

Gabriel Staples
źródło
0

W Javie Regexkonstruktor ma

Regex(String pattern, RegexOption option)

Aby zignorować przypadki, użyj

option = RegexOption.IGNORE_CASE
Aziz
źródło
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

David Morrow
źródło
-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.

Alexander Drobyshevsky
źródło