Normal ifadenin büyük / küçük harf duyarlılığının yalnızca bir kısmını yapabilir misiniz?


101

Normal ifadenin tamamını büyük / küçük harfe duyarlı hale getirmenin birçok örneğini gördüm. Merak ettiğim şey, ifadenin sadece bir kısmının büyük / küçük harfe duyarlı olmaması.

Örneğin, şöyle bir dizgim olduğunu varsayalım:

fooFOOfOoFoOBARBARbarbarbAr

Büyük / küçük harfe bakılmaksızın tüm "foo" oluşumlarını eşleştirmek istiyorsam, ancak yalnızca büyük "BAR" harflerini eşleştirmek istiyorsam?

İdeal çözüm, normal ifade çeşitlerinde işe yarayan bir çözüm olabilir, ancak dile özgü olanları da duymakla ilgileniyorum (Teşekkürler Espo )

Düzenle

Espo'nun sağladığı bağlantı çok yardımcı oldu. İfade içinde değiştiricileri açıp kapatmayla ilgili güzel bir örnek var.

Yapmacık örneğim için şöyle bir şey yapabilirim:

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

Bu, eşleşmeyi, maçın sadece foo kısmı için büyük / küçük harfe duyarlı hale getirir.

Bu, Javascript, Python ve birkaç diğerleri (Espo'nun bahsettiği gibi) dışında çoğu regex uygulamasında işe yarıyor gibi görünüyordu.

Merak ettiğim büyüklerin (Perl, PHP, .NET) hepsi satır içi mod değişikliklerini destekliyor.


Bu soru, "Değiştiriciler" altındaki Yığın Taşması Normal İfade SSS bölümüne eklenmiştir .
aliteralmind

Yanıtlar:


88

Perl, (? İ :) kalıp değiştiricisini kullanarak normal ifadenizin bir bölümünü büyük / küçük harf duyarlı olmadan yapmanıza izin verir.

Modern normal ifade çeşitleri, normal ifadenin yalnızca bir kısmına değiştiriciler uygulamanıza olanak tanır. Düzenleyiciyi (? İsm) normal ifadenin ortasına eklerseniz, değiştirici yalnızca normal ifadenin değiştiricinin sağındaki kısmı için geçerlidir. Önlerinde bir eksi işareti koyarak modları kapatabilirsiniz. Eksi işaretinden sonraki tüm modlar kapatılacaktır. Örneğin (? İ-sm), büyük / küçük harf duyarlılığını açar ve hem tek satır modunu hem de çok satırlı modu kapatır.

Tüm normal ifade türleri bunu desteklemez. JavaScript ve Python, tüm mod değiştiricilerini normal ifadenin tamamına uygular. (? -İsmx) sözdizimini desteklemezler, çünkü mod değiştiriciler tüm normal ifadelere uygulandığında bir seçeneği kapatmak anlamsızdır. Varsayılan olarak tüm seçenekler kapalıdır.

Kullandığınız normal ifade çeşidinin tutamaç modu değiştiricilerini nasıl kullandığını hızlıca test edebilirsiniz. Normal ifade (? İ) te (? - i) st, test ve TEst ile eşleşmeli, ancak teST veya TEST ile eşleşmemelidir.

Kaynak


6

Hangi dili kullanıyorsun Bunu yapmanın standart bir yolu, büyük / küçük harf duyarlılığı açık olan / ([Ff] [Oo] {2} | BAR) / gibi bir şey olabilir, ancak örneğin Java'da, hepsini yapan bir büyük / küçük harf duyarlılığı değiştiricisi (? İ) sağındaki karakterler büyük / küçük harf duyarlı değildir ve hassasiyeti zorlayan (? -i). Java normal ifade değiştiricisinin bir örneği burada bulunabilir .


Eğer her iki durumu da maç varken 1 Neden bu durum duyarsız yapma zahmetine
Nona Urbiz

11
@NonaUrbiz: Çünkü ifade (?i)foobardaha okunaklı[Ff][Oo]{2}[Bb][Aa][Rr]
Thanatos

1
Ve bu büyüyebilir, çünkü yolu çok daha kıllı ve karmaşık.
doğrayın

6

Maalesef büyük / küçük harfe duyarlı olmayan eşleştirme için sözdizimi yaygın değildir. .NET'te RegexOptions.IgnoreCase bayrağı veya ? İ değiştiricisini kullanabilirsiniz.


4

Kullanabilirsin

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

.Net'teki parantez içindeki?: Yakalamadığını ve sadece | (veya) ifade.


26
"[FF] [oO] [oO]" daha iyi bir alternatif değil mi? Eldeki örnek için "[fF] [oO] \ {2}" ;-)
Tomalak

4

Normal İfadenin Yalnızca Bir Kısmı İçin Modları Açma ve Kapatma'da açıklandığı gibi satır içi değiştiricilere güvenilebileceği doğrudur :

Normal ifade (?i)te(?-i)sttest ile eşleşmeli ve TEstancak teSTveya ile eşleşmemelidir TEST.

Bununla birlikte, biraz daha desteklenen bir özellik, bir (?i:...)satır içi değiştirici grubudur (bkz. Değiştirici Aralıkları ). Sözdizimi, büyük (?i:harf duyarlılığını ortadan kaldırmak istediğiniz kalıp ve ardından a ).

(?i:foo)|BAR

Ters : En desen bir vaka duyarsız seçeneğiyle derlenmiş ve bir düzenli ifade durumunda bir parçası duyarlı yapmak gerekir ise, eklemek -sonra ?: (?-i:...).

Çeşitli dillerde örnek kullanımlar (eşleşmeleri açılı parantezlerle sararak):

  • - preg_replace("~(?i:foo)|BAR~", '<$0>', "fooFOOfOoFoOBARBARbarbarbAr")( gösteri )
  • - re.sub(r'(?i:foo)|BAR', r'<\g<0>>', 'fooFOOfOoFoOBARBARbarbarbAr')( demo ) ( Python'un re, Python 3.6'dan beri satır içi değiştirici grupları desteklediğini unutmayın )
  • / / - Regex.Replace("fooFOOfOoFoOBARBARbarbarbAr", "(?i:foo)|BAR", "<$&>")( gösteri )
  • - "fooFOOfOoFoOBARBARbarbarbAr".replaceAll("(?i:foo)|BAR", "<$0>")( gösteri )
  • - $s =~ s/(?i:foo)|BAR/<$&>/g( gösteri )
  • - "fooFOOfOoFoOBARBARbarbarbAr".gsub(/(?i:foo)|BAR/, '<\0>')( gösteri )
  • - gsub("((?i:foo)|BAR)", "<\\1>", "fooFOOfOoFoOBARBARbarbarbAr", perl=TRUE)( gösteri )
  • - "fooFOOfOoFoOBARBARbarbarbAr".replacingOccurrences(of: "(?i:foo)|BAR", with: "<$0>", options: [.regularExpression])
  • - (RE2 kullanır) - regexp.MustCompile(`(?i:foo)|BAR`).ReplaceAllString( "fooFOOfOoFoOBARBARbarbarbAr", `<${0}>`)( demo )

Desteklenmez , , , std::regex, , .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.