【发布时间】:2021-02-11 18:55:52
【问题描述】:
我正在尝试在 Flex 中运行一些简单的正则表达式,但我无法让运算符“^”作为否定。 这是我的代码:`
%%
[^abc] printf("rule triggered\n");
.
\n
它应该只匹配任何不是“a”、“b”或“c”的字符,但我得到的是: “警告,规则无法匹配”。
“^”的其他用法似乎很好用,^a 匹配任何以“a”开头的字符串,而 [a^b] 匹配任何包含“a”或“b”的字符串。此外,奇怪的是,如果前面有其他内容,规则 [^a] 会按预期工作,例如:
%%
b+[^a] printf("rule triggered\n");
.
\n
这匹配一个以任意数量的“b”开头且后面没有“a”的字符串,并且似乎可以正常工作。但如果我允许“b”的出现为零,则它将不起作用:
%%
b*[^a] printf("rule triggered\n");
.
\n
这给出了相同的“警告,规则无法匹配”,果然,不起作用。有点难住了。
ps。如果这很重要,我会在 cycgwin 中使用 Flex(它应该与所有 Lex 语法兼容)。
`
【问题讨论】:
-
除了产生警告之外,它在哪些方面没有按您的预期工作?我假设您希望每行打印的“规则触发”行少于实际打印一次。对吗?
-
我只是注意到即使我使用了“a”、“b”和“c”,它也会一直触发,所以我认为它不符合那个特定的规则。您的评论刚刚让我意识到它与“\n”的规则不匹配,这意味着“a”后跟 return 触发了规则,因为“\n”实际上不是“a”、“b”也不是“c”。将“\n”的规则放在第一行可以修复警告并给我预期的行为。非常感谢!
标签: regex compiler-construction flex-lexer lex lexer