Bir dizenin tamamını bir normal ifadeyle nasıl eşleştiririm?


82

Yalnızca tüm dizenin sorgumla eşleştiği yerde eşleşmeleri bulacak bir normal ifadeye ihtiyacım var.

Örneğin, "Kızıl Ekim" adlı filmleri ararsam, yalnızca tam olarak bu başlıkla (büyük / küçük harfe duyarlı değildir) eşleştirmek istiyorum, ancak "Kızıl Ekim Avı" gibi başlıklarla eşleşmem. Bunu nasıl yapacağımı bildiğimden pek emin değilim. Bilen var mı?

Teşekkürler!


1
Basit bir şeyin string.Containsişe yarayacağı bir şey için neden bir normal ifadeye ihtiyacınız var ?
Oded

1
Normal ifadeyi kullanmamın nedeni, onu MongoDB'de bir arama için kullanıyorum ve büyük / küçük harfe duyarlı olmamam gerekiyor ki bu sadece bir normal
ifadeyle

Neden arama için (anında) db verilerini küçük harfe ve kullanıcı küçük harfli dizeye dönüştürmüyorsunuz?
greenoldman

1
@macias Bunun daha iyi bir seçenek olacağına katılmıyorum ama maalesef şu anki durumum buna izin vermiyor.
Micah

Bilginize, Bir normal ifade kullanmaya gerek yoksa, iki dizeyi büyük / küçük harfe göz ardı ederek karşılaştırmaya çalışmak basitçe yapabilirstring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

Yanıtlar:


111

Aşağıdaki normal ifadeyi deneyin:

^Red October$

Varsayılan olarak, normal ifadeler büyük / küçük harfe duyarlıdır. ^İşaretleri eşleşen metin ve başlatmak $sonunda.


1
Bilginize, normal ifade nesnesini oluştururken, büyük / küçük harfe duyarlı hale getirmek için ikinci parametre RegexOptions.IgnoreCase eklemeniz gerektiğini belirtmeye değer.
ToolmakerSteve

Bu dizgiyi çevreleyen başka bir şey varsa bu işe yaramaz. Örneğin, Street'te olduğu gibi "St" kelimesini arıyorsanız, ancak aynı satırda "St" ile başlayan "Stirling" adı gibi başka dizeleriniz varsa, bu normal ifade tam olarak eşleşmeyecektir. Ne yazık ki bu senaryo için RegEx'in doğru yanıt olduğundan emin değilim. Yine de denemeye devam edeceğim. Tim'in aşağıdaki cevabı iyidir, ancak tüm motorlar bunu desteklemez.
dyslexicanaboko

Aslında, $her zaman dizenin sonuyla eşleşmez, \zyapar ( \ZPython'daki eşdeğerdir). Lütfen Tim Pietzcker'in cevabına bakın . Yine de JavaScript için doğrudur.
Wiktor Stribiżew

42

Genel olarak ve varsayılan ayarlarla ^ve $çapalar, bir normal ifadenin tüm dizeyle eşleşmesini sağlamanın iyi bir yoludur.

Yine de birkaç uyarı:

Eğer regex ardalanmasından varsa, onu çevreleyen önce olmayan bir yakalama grubundaki regex içine mutlaka ^ve $:

^foo|bar$

tabii ki farklı

^(?:foo|bar)$

Ayrıca, ^ve $(/ sonunu başlatmak farklı bir anlam alabilir hattı yerine başlangıç / sonu dizesi belirli seçenekler ayarlanır ise). Normal ifadeleri destekleyen metin düzenleyicilerde bu genellikle varsayılan davranıştır. Bazı dillerde, özellikle Ruby'de, bu davranış kapatılamaz bile.

Bu nedenle, yalnızca tüm dizenin başında / sonunda eşleşeceği garanti edilen başka bir sabitleme kümesi vardır:

\A dizenin başında eşleşir.

\Z dizenin sonunda veya son satır kesilmesinden önce eşleşir.

\z dizenin en sonundaki eşleşir.

Ancak tüm diller bu bağlantıları desteklemez, en önemlisi JavaScript.


4
bu en yararlı cevap
Jeremy Danyow

18

Normal ifade deseninin dizenin başlangıcına ve sonuna göre nerede olduğunu belirtmek için ^ve $değiştiricilerini kullanın :

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail

10

Bunu yanıtlamak için bunun biraz geç olabileceğini biliyorum, ama belki başka biri için kullanışlı olabilir.

En basit yol:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}

2
IMHO bu, kabul edilen cevaptan daha az basittir. Ama bu bir alternatiftir.
ToolmakerSteve

Bu yanıtı beğendim çünkü kodun kendisi normal ifadeyi değiştirmek yerine amaçlanan davranışı gösteriyor (ki bu, normal ifadeyi çok az anlayan koda göz atan biri için daha az anlaşılır olabilir). Olası aksaklık, normal ifadenin, tam bir eşleşme mümkün olsa bile kısmi eşleşmeyi döndüren Regex.Match işlevi ile dizenin tamamı veya bir kısmı ile eşleşecek şekilde yazılabilmesidir.
John Thoits

8

Normal ifadenizi ^(dizenin başlangıcı) ve $(dizenin sonu ) içine almanız gerekir :

^Red October$

0

Üzgünüm ama bu biraz belirsiz.

Okuduklarıma göre, basit bir dizi karşılaştırması yapmak istiyorsunuz. Bunun için normal ifadeye ihtiyacınız yok.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());

1
Normal ifadeyi kullanmamın nedeni, onu MongoDB'de arama yapmak için kullanıyorum ve büyük / küçük harfe duyarlı olmamasına ihtiyacım var ki bu sadece bir normal ifadeyle yapılabilir.
Micah

-1

Bir dizede eksi a harfini yalnızca bir kez yakalamak istiyorsam ve myRegex.IsMatch () ile kontrol edilebiliyorsa, bunu bu Örnek gibi yapabilirsiniz.

^ [^ e] [e] {1} [^ e] $

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.