0

在 LINQPad (.NET) 中,所有这些表达式都返回“True”:

new Regex(@"\w{0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"(\w){0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"[\w]{0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"([\w]){0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"\w{0,0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"(\w){0,0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"[\w]{0,0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"([\w]){0,0}").IsMatch("aa aa ZZ Z").Dump();
new Regex(@"([a]){0,0}").IsMatch("aaaaZZZ").Dump();

为什么?

4

3 回答 3

6

{0}我假设您的计划是通过使用量词来确保源字符串中不存在某个字符。这不会像这样工作。{0}量词本身在这里是没用的——它的意思是“匹配前一个标记零次” 。这适用于所有字符串,甚至是空字符串。零仅用作下限,例如a{0,5}用于匹配零到五个as。

正则表达式旨在匹配文本,因此您需要通过一些扭曲来使它们与文本不匹配。例如:

Regex(@"^\W*$")  // syntactic sugar for Regex(@"^[^\w]*$")

仅当整个字符串由非字母数字字符组成时才匹配。

Regex(@"^[^a]*$")

仅当整个字符串由 . 以外的字符组成时才匹配a

于 2013-06-10T15:25:09.530 回答
4

正则表达式在积极断言方面比消极断言更好。 new Regex(@"\w{0}")是一样的new Regex(@""){0}表示匹配 的零个实例\w。由于正则表达式中没有其他内容,因此它将匹配所有输入字符串。

于 2013-06-10T15:30:11.530 回答
3

您正在尝试在每个表达式上匹配世界上所有字符串中都存在的零宽度字符串。因此它返回true。

于 2013-06-10T15:25:00.790 回答