2008-09-04 12 views
83

Widziałem wiele przykładów tworzenia całych nieregularnych wielkości liter w wyrażeniu regularnym. Zastanawiam się nad tym, aby tylko część wyrażenia była niewrażliwa na wielkość liter.Czy można zrobić tylko część regex case-niewrażliwe?

Na przykład, powiedzmy, że mam ciąg jak poniżej:

fooFOOfOoFoOBARBARbarbarbAr 

Co jeśli chcę, aby dopasować wszystkie wystąpienia „foo”, niezależnie od przypadku, ale chcę tylko, aby dopasować dużych liter „BAR "s?

Idealnym rozwiązaniem byłoby coś, co działa na smakach regex ale jestem zainteresowany te specyficzne dla danego języka słuchowych jak również (Dzięki Espo)

edycję

Link Espo warunkiem było bardzo pomocne. Jest tam dobry przykład włączania i wyłączania modyfikatorów włączania w wyrażeniu.

Dla mojego contrived przykład, mogę zrobić coś takiego:

(?i)foo*(?-i)|BAR 

co sprawia, że ​​bez uwzględniania wielkości liter tylko dla części foo meczu meczu.

To wydawało się działać w większości implementacji wyrażeń regularnych z wyjątkiem Javascript, Python i kilku innych (jak wspomniano w Espo).

Wielkie, o które się zastanawiałem (Perl, PHP, .NET), wszystkie obsługują zmiany w trybie liniowym.

+0

Kwestia ta została dodana do przepełnienie stosu [FAQ] wyrażenie regularne (http://stackoverflow.com/a/22944075/2736496) w "Modyfikatory". – aliteralmind

Odpowiedz

77

Perl pozwala na uwzględnienie wielkości liter w wyrażeniu regularnym za pomocą modyfikatora wzoru (? I :).

Nowoczesne smaki regex umożliwiają stosowanie modyfikatorów tylko do części wyrażenia regularnego. Jeśli wstawisz modyfikator (? Ism) w środku wyrażenia regularnego, modyfikator ma zastosowanie tylko do części regex po prawej stronie modyfikatora. Możesz wyłączyć tryby, poprzedzając je znakiem minus. Wszystkie tryby po znaku minus będą wyłączone. Na przykład. (? i-sm) włącza niewrażliwość na wielkość znaków i wyłącza zarówno tryb pojedynczej linii, jak i tryb wieloliniowy.

Nie wszystkie smaki regex obsługują to. JavaScript i Python stosują modyfikatory wszystkich modów do całego wyrażenia regularnego. Nie obsługują składni (? -ismx), ponieważ wyłączenie opcji nie ma sensu, gdy modyfikatory trybu mają zastosowanie do całych wyrażeń regularnych. Wszystkie opcje są domyślnie wyłączone.

Możesz szybko sprawdzić, w jaki sposób smak regexu, którego używasz, obsługuje modyfikatory trybu. Polecenie regex (? I) te (? - i) st powinno pasować do testu i TEst, ale nie do teST lub TEST.

Source

+0

działa na hg/mercurial. niesamowite! – RubyTuesdayDONO

4

Można użyć

(?:F|f)(?:O|o)(?:O|o) 

The: w nawiasach w .NET Oznacza to zakaz chwytania i po prostu stosować się do grupy z warunkami | (lub) instrukcja.

+24

Czy "[fF] [oO] [oO]" nie jest lepszą alternatywą? Dla przykładu można nawet posunąć się do "[fF] [oO] \ {2}" ;-) – Tomalak

5

W jakim języku się posługujesz? Standardowy sposób zrobienia tego będzie podobny do/([Ff] [Oo] {2} | BAR)/z włączoną rozróżnianiem wielkości liter, ale w Javie na przykład istnieje modyfikator wielkości liter (?i), który powoduje, że wszystkie znaki po prawej stronie są niewrażliwe na wielkość liter i (? -i), które wymuszają czułość. Przykład tego modyfikatora regex Java można znaleźć here.

+0

+1 Po co zawracać sobie głowę rozróżnieniem wielkości liter, kiedy można dopasować oba przypadki –

+5

@NonaUrbiz: Ponieważ wyrażenie ' (? i) foobar' jest bardziej czytelny niż '[Ff] [Oo] {2} [Bb] [Aa] [Rr]' – Thanatos

+0

I dlatego, że może się wydłużyć ... znacznie bardziej owłosione i złożone. – Chop

6

Niestety składnia dla dopasowywania wielkości liter nie jest typowa. W .NET można użyć RegexOptions.IgnoreCase flagę lub ? I modyfikator

Powiązane problemy