Как сопоставить всю строку с регулярным выражением?


Мне нужно регулярное выражение, которое будет находить только совпадения, где вся строка соответствует моему запросу.

например, если я выполняю поиск фильмов с именем "Red October", я хочу только соответствовать этому точному названию (без учета регистра), но не соответствовать названиям, таким как "The Hunt For Red October". Не совсем уверен, что знаю, как это сделать. Кто-нибудь знает?

спасибо!

8 51

8 ответов:

попробуйте следующее регулярное выражение:

^Red October$

по умолчанию регулярные выражения чувствительны к регистру. Элемент ^ отмечает начало соответствующего текста и $ конец.

как правило, и с настройками по умолчанию, ^ и $ якоря-это хороший способ убедиться, что регулярное выражение соответствует всей строке.

несколько предостережений, хотя:

если у вас есть чередование в вашем регулярном выражении, обязательно заключите свое регулярное выражение в группу без захвата, прежде чем окружать его ^ и $:

^foo|bar$

конечно отличается от

^(?:foo|bar)$

и ^ и $ может взять на себя другой смысл (начало/конец строка вместо начала / конца строка) если установлены определенные параметры. В текстовых редакторах, поддерживающих регулярные выражения, это обычно поведение по умолчанию. В некоторых языках, особенно Ruby, это поведение даже не может быть отключено.

поэтому существует еще один набор якорей, которые гарантированно совпадают только в начале / конце всей строки:

\A матчи в начале строка.

\Z совпадения в конце строки или перед окончательным разрывом строки.

\z матчи в самом конце строки.

но не все языки поддерживают эти якоря, особенно на JavaScript.

использовать ^ и $ модификаторы для обозначения того, где шаблон регулярного выражения находится относительно начала и конца строки:

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

вам нужно заключить ваше регулярное выражение в ^ (начало строки) и $ (конец строки):

^Red October$

Я знаю, что это может быть немного поздно, чтобы ответить на этот вопрос, но, возможно, это пригодится для кого-нибудь другого.

самый простой способ:

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

Извините, но это немного непонятно.

из того, что я читал, вы хотите сделать простое сравнение строк. Вам не нужно регулярное выражение для этого.

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

сопоставление всей строки может быть сделано с ^ и $ Как сказано в предыдущих ответах.

чтобы сделать регистр регулярных выражений нечувствительным, вы можете реализовать взлом, который включает классы символов. А много классы персонажей.

^[Rr][Ee][Dd] [Oo][Cc][Tt][Oo][Bb][Ee][Rr]$

вы можете сделать это так, например, если я хочу только один раз поймать букву минус a в строке, и ее можно проверить с помощью myRegex.Выполняется()

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