我正在尝试编写具有上述特征的字符串的正则表达式。这里,特定字符串是“true”和“false”。例如:“d6”将被接受,但“6d”将不被接受。也不接受“真实”和“虚假”。我已经google了很多,得到了各种各样的例子,但仍然无法做到。请帮忙。
答案 0 :(得分:1)
如果你真的打算使用lex(或flex),那么你需要将关键字与不同的规则相匹配。
请记住(f)lex应用maximal munch rule:在输入的每个点,匹配的标记是所有模式的最长匹配,因此执行附加到具有最长匹配的模式的规则。此外,如果两个或多个不同的模式都产生相同的最长匹配,则文件中的第一个获胜。
因此,这是您匹配true
或false
以外的标识符的方式:
false { /* Action for the keyword false */ }
true { /* Action for the keyword true */ }
[[:alpha:]][[:alnum:]]* {
/* Action for all other identifiers */
}
如果您还想匹配整数,可以添加:
[[:digit:]]+ {
/* Action for integers */
}
这不会为像6d
之类的令牌产生错误。有充分的理由将其视为两个令牌而不是产生错误(例如,参见this answer中的讨论),但如果您真的想将其视为错误,则可以添加错误模式:
[[:digit:]]+[[:alpha:]][[:alnum:]]* {
/* Action for tokens which start with a digit and contain a letter */
}
上面使用的Posix字符类([[:digit:]]
等)记录在flex manual chapter on patterns中。
答案 1 :(得分:0)
我认为以下正则表达式符合您的要求:
/(?!.*(true|false))^[a-zA-Z]+[a-zA-Z0-9]*$/
上述正则表达式的详细信息如下:
首先,整个字符串中不应该有字符串'true'或'false',(?!.*(true|false))
这是一个负向前瞻,这意味着没有任何值后跟true或false值。你可以从这里了解有关lookahead的更多信息。
其次,它应该以字符开头,以便^[a-zA-Z]+
最后,其余字符串中可以有任意数量的字符和数字,然后结尾与[a-zA-Z0-9]*$
匹配。
希望这能解决你的问题。
答案 2 :(得分:0)
您的条件是
我只想匹配任何字符串以后跟字母开头 字母和数字。
这可以通过^[a-zA-Z][a-zA-Z0-9]+$
但如果字符串是" true "或" false ",这不会 被接受。
这是比较棘手的部分,似乎lex不支持负向前瞻或正面/负面的后视。所以我们只是坚持前瞻性。
这个正则表达式解决了前瞻性的问题
^(?=[^tf]|t[^r]|tr[^u]|true[a-zA-Z0-9]|f[^a]|fa[^l]|fal[^s]|false[a-zA-Z0-9])[a-zA-Z][a-zA-Z0-9]+$
前瞻部分是
^(?=[^tf]|t[^r]|tr[^u]|true[a-zA-Z0-9]|f[^a]|fa[^l]|fal[^s]|false[a-zA-Z0-9])
它希望下一个字符串不是true或false。 它允许更真实,falsetto等仅防止真假。
问题是我找不到用lex格式来解决这个问题的方法。因为lex没有使用(?=)
语法。它使用r1/r2
语法,如果r1
后跟r2
,则匹配{{1}}。在我们的例子中,如果r1为真,我们想要捕获r2。
我希望其他人继续将其转换为正确的lex格式
可以找到给定正则表达式的演示here