Jak dopasować cały ciąg do wyrażenia regularnego?

82

Potrzebuję wyrażenia regularnego, które znajdzie dopasowania tylko wtedy, gdy cały ciąg pasuje do mojego zapytania.

Na przykład, jeśli wyszukuję filmy z tytułem „Czerwony październik”, chcę dopasować tylko do tego dokładnego tytułu (bez rozróżniania wielkości liter), ale nie chcę dopasować tytułów takich jak „Polowanie na czerwony październik”. Nie jestem pewien, czy wiem, jak to zrobić. Ktoś wie?

Dzięki!

Micheasza
źródło
1
Dlaczego potrzebujesz wyrażenia regularnego do czegoś, do czego string.Containsbędzie działać proste ?
Oded
1
Powodem, dla którego muszę używać wyrażenia regularnego, jest to, że używam go do wyszukiwania w MongoDB i potrzebuję, aby nie rozróżniał wielkości liter, co można zrobić tylko za pomocą wyrażenia regularnego
Micah
Dlaczego nie przekonwertować (w locie) danych db na małe i małe litery użytkownika na potrzeby wyszukiwania?
greenoldman
1
@macias Nie przeczę, że byłaby to lepsza opcja, ale niestety moja obecna sytuacja na to nie pozwala.
Micah
Do Twojej wiadomości, jeśli nie wymaga użycia wyrażenia regularnego, po prostu próbując porównać dwa ciągi znaków ignorując wielkość liter, można po prostu zrobićstring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

Odpowiedzi:

111

Wypróbuj następujące wyrażenie regularne:

^Red October$

Domyślnie w wyrażeniach regularnych rozróżniana jest wielkość liter. Znak ^oznacza początek pasującego tekstu i $koniec.

Pieter van Ginkel
źródło
1
FYI, warto wspomnieć, że aby nie rozróżniać wielkości liter, podczas tworzenia obiektu regex należy dodać drugi parametr RegexOptions.IgnoreCase.
ToolmakerSteve
To nie działa, jeśli jest coś innego otaczającego ten ciąg. Na przykład, jeśli szukałeś „St” jak w Street, ale masz inne ciągi w tym samym wierszu, które również zaczynają się od „St”, takie jak nazwa „Stirling”, to wyrażenie regularne nie będzie pasować dokładnie. Niestety nie jestem pewien, czy RegEx jest właściwą odpowiedzią na ten scenariusz. Mimo wszystko będę próbował dalej. Odpowiedź Tima poniżej jest dobra, ale nie wszystkie silniki to obsługują.
dyslexicanaboko
Właściwie $nie zawsze pasuje do końca łańcucha, \ztak ( \Zjest odpowiednikiem w Pythonie). Zobacz odpowiedź Tima Pietzckera . Dotyczy to jednak JavaScript.
Wiktor Stribiżew
42

Ogólnie rzecz biorąc, z domyślnymi ustawieniami ^i $kotwicami to dobry sposób na upewnienie się, że wyrażenie regularne pasuje do całego ciągu.

Jednak kilka zastrzeżeń:

Jeśli masz zmianę w swoim wyrażeniu regularnym, pamiętaj, aby umieścić swoje wyrażenie regularne w grupie nieprzechwytywanej przed otoczeniem go za pomocą ^i $:

^foo|bar$

oczywiście różni się od

^(?:foo|bar)$

Ponadto ^i $może mieć inne znaczenie (początek / koniec wiersza zamiast początku / końca łańcucha ), jeśli określone opcje są ustawione. W edytorach tekstu obsługujących wyrażenia regularne jest to zwykle zachowanie domyślne. W niektórych językach, szczególnie w Rubim, tego zachowania nie można nawet wyłączyć.

Dlatego istnieje inny zestaw kotwic, które na pewno będą pasować tylko na początku / końcu całego ciągu:

\A dopasowuje na początku ciągu.

\Z dopasowania na końcu łańcucha lub przed końcowym podziałem wiersza.

\z pasuje na samym końcu ciągu.

Ale nie wszystkie języki obsługują te kotwice, w szczególności JavaScript.

Tim Pietzcker
źródło
4
to najbardziej pomocna odpowiedź
Jeremy Danyow
18

Użyj modyfikatorów ^i, $aby określić, gdzie znajduje się wzorzec wyrażenia regularnego względem początku i końca ciągu:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail
Tim Robinson
źródło
10

Wiem, że może być trochę za późno na odpowiedź, ale może przyda się komuś innemu.

Najprostszy sposób:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}
Zixav
źródło
2
IMHO to jest MNIEJ proste niż akceptowana odpowiedź. Ale to alternatywa.
ToolmakerSteve
Podoba mi się ta odpowiedź, ponieważ sam kod pokazuje zamierzone zachowanie, zamiast modyfikować wyrażenie regularne (co może być mniej jasne dla kogoś, kto spojrzy na kod i nie rozumie wyrażenia regularnego). Potencjalnym problemem jest to, że wyrażenie regularne można zapisać w taki sposób, aby pasowało do całego ciągu lub jego części, a funkcja Regex.Match zwraca częściowe dopasowanie, mimo że możliwe jest pełne dopasowanie.
John Thoits
8

Musisz umieścić swoje wyrażenie regularne w ^(początek ciągu) i $(koniec ciągu):

^Red October$
Anton Gogolev
źródło
0

Przepraszam, ale to trochę niejasne.

Z tego, co przeczytałem, chcesz zrobić proste porównanie ciągów. Nie potrzebujesz do tego wyrażenia regularnego.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());
Dean Thomas
źródło
1
Powodem, dla którego muszę używać wyrażenia regularnego, jest to, że używam go do wyszukiwania w MongoDB i potrzebuję, aby był niewrażliwy na wielkość liter, co można zrobić tylko za pomocą wyrażenia regularnego.
Micah
-1

Możesz to zrobić w ten sposób, jeśli chcę tylko raz złapać literę minus a w ciągu i można to sprawdzić za pomocą myRegex.IsMatch ()

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

Vincent Roy
źródło