lex 中的正则表达式 [^a-z]*
Regex in lex [^a-z]*
对于给定的正则表达式,[^a-z]*
in lex
,问题是它会匹配任何不包含任何小写字母的单词,还是这不是正确的实现?也就是说,对于那个特定的场景,应该使用给定的正则表达式,或者这是匹配没有小写字母的单词的正确正则表达式:[^a-z]+
?
我的推理是不是,应该是+
而不是*
,因为取反范围,有0个或多个可能的情况。似乎错了。但我很难理解为什么它是错误的。我在网上尝试了几个正则表达式工具,但都失败了,有些设法证明它有效,有些显示更多字符之间的匹配。
我会说否定一个小写字符串,并说它是 0 个或多个,这也将匹配字符串 abc
,因为它(确实满足它没有的场景任何东西的 0。对于任何字符串都可以这样说。+
似乎是一个更直观的选项,但在这种情况下使用了 *
,我认为它的实现不正确,但找不到任何资源备份它,因为 Google 不能很好地使用这些搜索字符串。
一些测试用例,这是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 实现是否有所不同,但正如我所描述的,* 用法不匹配范围感觉有些不对劲。
(F)lex 规则从不匹配空字符串,因此在此上下文中使用 *
或 +
没有任何区别。
但我认为这个问题没有捕捉到行为。 (f)lex 规则匹配匹配任何模式的最长字符串,[^a-z]+
将匹配任何字符序列,无论是标点符号、白色 space、不可打印的控制代码等,except小写字母。 (换句话说,它不仅仅匹配 "words" 除非你有一个不寻常的 "word" 定义。
对于给定的正则表达式,[^a-z]*
in lex
,问题是它会匹配任何不包含任何小写字母的单词,还是这不是正确的实现?也就是说,对于那个特定的场景,应该使用给定的正则表达式,或者这是匹配没有小写字母的单词的正确正则表达式:[^a-z]+
?
我的推理是不是,应该是+
而不是*
,因为取反范围,有0个或多个可能的情况。似乎错了。但我很难理解为什么它是错误的。我在网上尝试了几个正则表达式工具,但都失败了,有些设法证明它有效,有些显示更多字符之间的匹配。
我会说否定一个小写字符串,并说它是 0 个或多个,这也将匹配字符串 abc
,因为它(确实满足它没有的场景任何东西的 0。对于任何字符串都可以这样说。+
似乎是一个更直观的选项,但在这种情况下使用了 *
,我认为它的实现不正确,但找不到任何资源备份它,因为 Google 不能很好地使用这些搜索字符串。
一些测试用例,这是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 实现是否有所不同,但正如我所描述的,* 用法不匹配范围感觉有些不对劲。
(F)lex 规则从不匹配空字符串,因此在此上下文中使用 *
或 +
没有任何区别。
但我认为这个问题没有捕捉到行为。 (f)lex 规则匹配匹配任何模式的最长字符串,[^a-z]+
将匹配任何字符序列,无论是标点符号、白色 space、不可打印的控制代码等,except小写字母。 (换句话说,它不仅仅匹配 "words" 除非你有一个不寻常的 "word" 定义。