在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();
为什么?
答案 0 :(得分:6)
我假设您的计划是通过使用{0}
量词来确保源字符串中不存在某个字符。这不会像这样工作。 {0}
量词本身在这里没用 - 它意味着"匹配前一个令牌零次"。这适用于所有字符串,甚至是空字符串。零仅作为下限使用,例如在a{0,5}
中匹配零到五a
s。
正则表达式旨在匹配文本,因此您需要经历一些扭曲以使它们不匹配文本。例如:
Regex(@"^\W*$") // syntactic sugar for Regex(@"^[^\w]*$")
仅当整个字符串由非字母数字字符组成时,才匹配。
Regex(@"^[^a]*$")
仅当整个字符串由a
以外的字符组成时才匹配。
答案 1 :(得分:4)
正则表达式在积极断言方面优于否定方面。 new Regex(@"\w{0}")
与new Regex(@"")
相同。 {0}
表示匹配\w
的零个实例。由于正则表达式中没有其他内容,因此它将匹配所有输入字符串。
答案 2 :(得分:3)
您正在尝试使用每个表达式来匹配世界上所有字符串中存在的零宽度字符串。因此它返回true。