对于[^a-z]*
中给定的正则表达式lex
,问题是它是否匹配任何不包含任何小写字母的单词,或者这不是正确的实现?即,对于该特定场景,是否应该使用给定的正则表达式,或者这是否适合匹配没有小写字母的单词:[^a-z]+
?
我的理由是它不是,它应该是+
而不是*
,因为范围的否定,有0或更多可能的情况。似乎错了。但是我很难理解为什么这是错的。我尝试了几种在线的正则表达式工具,它的命中与遗漏,一些设法表明它有效,一些显示字符之间更多匹配。
我会说,否定一个小写的字符串,并说它的0或更多,也会匹配字符串abc
,因为它(确实满足它没有的情况) 0可以说任何字符串。+
似乎是一个更直观的选项,但在这种情况下*
被使用了,我认为它是一个不正确的实现,但无法找到任何支持它的资源,因为谷歌没有很好地使用这些搜索字符串。
一些测试用例,这是node.js:
/[^a-z]*$/.test('testTEST123') - True
/[^a-z]*$/.test('test') - True (this one should be false as per problem statement)
/[^a-z]+$/.test('testTEST123') - True
/[^a-z]+$/.test('test') - False (this one is correct, so there are no matches that dont satisfy the regex)
在regex101.com上,结果类似,但突出显示的部分是该行的结尾,尽管那里没有字符。
我不知道是否有一些特定的正则表达式的lex实现是不同的,但正如我所描述的那样,*用法与错误匹配范围感觉不对。
答案 0 :(得分:1)
(F)lex规则永远不会匹配空字符串,因此在此上下文中使用+
或[^a-z]+
没有任何区别。
但我不认为这个问题会抓住这个行为。 A(f)lex规则匹配任何模式匹配的最长字符串,{{1}}将匹配任何字符序列,无论是标点符号,空格,不可打印的控制代码等,除小写字母。 (换句话说,它不仅仅匹配“单词”,除非你有一个不寻常的“单词”定义。