如何使用正则表达式匹配整个字符串?

104

我需要一个正则表达式,只能找到整个字符串与我的查询完全匹配的结果。

例如,如果我搜索名为“Red October”的电影,我只想匹配该精确标题(不区分大小写),而不是像“寻找红色十月”的标题。不太确定如何做到这一点。有人知道吗?

谢谢!


1
为什么需要使用正则表达式,而简单的 string.Contains 却可以胜任呢? - Oded
1
我需要使用正则表达式的原因是我在MongoDB中进行搜索,而且我需要它不区分大小写,这只能通过正则表达式实现。 - Micah
为什么不将数据库数据即时转换为小写,并使用小写字符串进行搜索呢? - greenoldman
1
@macias,我并不反对这将是更好的选择,但不幸的是,我的当前情况并不允许。 - Micah
2
如果不需要使用正则表达式,只是想比较两个字符串而忽略大小写,可以简单地使用 string1.Equals(string2, StringComparison.OrdinalIgnoreCase); - ToolmakerSteve
8个回答

139

尝试使用以下正则表达式:

^Red October$

默认情况下,正则表达式是区分大小写的。符号^表示文本匹配的开头,而$表示结尾。


1
值得一提的是,为了使其不区分大小写,在创建正则表达式对象时,添加第二个参数RegexOptions.IgnoreCase。 - ToolmakerSteve
如果字符串周围有其他内容,这种方法就会失效。例如,如果您正在搜索“St”(如Street),但是在同一行上还有其他以“St”开头的字符串,例如名称“Stirling”,则此正则表达式将无法进行精确匹配。不幸的是,我不确定正则表达式是否适用于此场景。我将继续尝试。Tim下面的答案很好,但并非所有引擎都支持。 - dyslexicanaboko
实际上,“$”并不总是匹配字符串的结尾,“\z”可以(在Python中等同于“\Z”)。请参见[Tim Pietzcker的答案](https://dev59.com/nm855IYBdhLWcg3w1n88#4123738)。 不过在JavaScript中则是如此。 - Wiktor Stribiżew

54
通常情况下,使用默认设置,^$ 锚点是确保正则表达式匹配整个字符串的好方法。
但是有一些注意事项:
如果您的正则表达式中有选择,则请确保在用 ^$ 包围之前将其包含在非捕获组中:
^foo|bar$

当然与之不同

^(?:foo|bar)$

此外,如果设置了某些选项,^$ 可以具有不同的含义(表示行的开头/结尾而不是字符串的开头/结尾)。在支持正则表达式的文本编辑器中,这通常是默认行为。在一些语言中,特别是 Ruby,甚至无法关闭此行为。

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

\A 匹配字符串的开头。

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

\z 匹配字符串的最后。

但并非所有语言都支持这些锚点,尤其是 JavaScript。


4
这是最有帮助的答案。 - Jeremy Danyow
一个我没意识到的有趣点,直到因为在这里看到它而进行研究:?:表示括号不计入捕获组(因此它们不会影响现有正则表达式中的任何现有组编号)。如果你使用的REGEX不支持这个,你可以使用look-behind和look-ahead(也是非捕获):(?<=^)foo|bar(?=$) - Matt Arnold

24

我知道回答可能有点晚,但对于其他人可能会有用。

最简单的方法:

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

2
在我看来,这个答案比被接受的答案更复杂一些。但它是一个替代方案。 - ToolmakerSteve
我喜欢这个答案,因为代码本身展示了预期的行为,而不是修改正则表达式(这可能对那些对正则表达式理解较少的人来说不太清晰)。潜在的问题是,正则表达式可以被编写成匹配整个字符串或其中一部分,Regex.Match函数返回部分匹配,即使完全匹配也是可能的。 - John Thoits

22

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

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

9
你需要在正则表达式前后加上^(表示字符串的开头)和$(表示字符串的结尾):
^Red October$

1

如果字符串可能包含正则表达式元字符(. { } ( ) $等),建议使用

^\QYourString\E$

\Q从此处开始引用所有字符,直到遇到\E。否则,正则表达式可能不适当甚至无效。如果语言将正则表达式作为字符串参数使用(如示例中所示),应使用双斜杠:

^\\QYourString\\E$

希望这个提示对某些人有所帮助。

-2

抱歉,但这有点不清楚。

从我所读的来看,您想要进行简单的字符串比较。您不需要使用正则表达式。

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

2
我需要使用正则表达式的原因是我在MongoDB中进行搜索,而且我需要它不区分大小写,这只能通过正则表达式来实现。 - Micah

-2

你可以像这样做,例如,如果我只想在字符串中捕获一次字母“a”,并且可以使用myRegex.IsMatch()进行检查

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接