如何将整个字符串与正则表达式匹配?


82

我需要一个仅在整个字符串与我的查询匹配的地方找到匹配项的正则表达式。

例如,如果我搜索名称为“红色十月”的电影,我只想匹配该确切标题(不区分大小写),而不匹配“狩猎红色十月”之类的标题。不太确定我知道该怎么做。有人知道吗

谢谢!


1
为什么您需要使用正则表达式来实现简单的string.Contains工作?
Oded

1
我需要使用正则表达式的原因是我在MongoDB中使用它进行搜索,并且我需要使它不区分大小写,这只能通过正则表达式来完成
Micah 2010年

为什么不将(即时)数据库数据转换为小写和用户小写的字符串以进行搜索?
greenoldman 2010年

1
@macias我不同意这将是一个更好的选择,但是不幸的是我的当前情况不允许这样做。
米卡

仅供参考,如果不需要使用正则表达式,只需尝试比较两个字符串而忽略大小写,就可以轻松实现string1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve19年

Answers:


110

尝试以下正则表达式:

^Red October$

默认情况下,正则表达式区分大小写。该^标记的开始匹配的文本和$结束。


1
仅供参考,值得一提的是,使其不区分大小写,在创建正则表达式对象时,添加第二个参数RegexOptions.IgnoreCase。
ToolmakerSteve

如果该字符串周围还有其他任何内容,则此方法将无效。例如,如果您在Street中搜索“ St”,但是同一行上还有其他字符串也以“ St”开头,例如名称“ Stirling”,则此正则表达式将不完全匹配。不幸的是,我不确定RegEx是否适合这种情况。我将继续尝试。蒂姆(Tim)在下面的回答很好,但是并非所有引擎都支持。
dyslexicanaboko

实际上,$并不总是匹配字符串的结尾,而是匹配\z\Z在Python中是等效的)。请参阅Tim Pietzcker的答案。不过对于JavaScript来说确实如此。
WiktorStribiżew

40

通常,使用默认设置^$锚点是确保正则表达式匹配整个字符串的好方法。

不过,请注意以下几点:

如果您的正则表达式有替换,请确保在将正则表达式包含在一个非捕获组中之前,再使用^$

^foo|bar$

当然不同于

^(?:foo|bar)$

另外,如果设置了某些选项,^并且$可以具有不同的含义(的开始/结束而不是string的开始/结束)。在支持正则表达式的文本编辑器中,这通常是默认行为。在某些语言中,尤其是Ruby,甚至无法关闭此行为。

因此,有另一组锚保证仅在整个字符串的开头/结尾匹配:

\A 在字符串开头匹配。

\Z 在字符串末尾或最后一个换行符之前匹配。

\z 在字符串的末尾匹配。

但并非所有语言都支持这些锚点,最著名的是JavaScript。


4
这是最有帮助的答案
Jeremy Danyow

18

使用^$修饰符表示正则表达式模式相对于字符串的开始和结束位置:

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

10

我知道回答这个问题可能有点晚了,但也许对其他人来说会很方便。

最简单的方法:

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

2
恕我直言,这比接受的答案简单。但这是另一种选择。
制造商史蒂夫

我喜欢这个答案,因为代码本身显示了预期的行为,而不是修改正则表达式(对于那些不太了解正则表达式的人来说,这可能不太清楚)。潜在的问题是,可以编写正则表达式,以便它可以匹配整个字符串或字符串的一部分,而Regex.Match函数即使可以完全匹配也可以返回部分匹配。
John Thoits,


0

抱歉,这还不清楚。

根据我的读物,您想进行简单的字符串比较。您不需要正则表达式。

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

1
我需要使用正则表达式的原因是,我在MongoDB中使用它进行搜索,因此我需要做到不区分大小写,这只能使用正则表达式来完成。
米卡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.