正则表达式字符串,以字母开头,后跟字母和数字,但lex中的两个特定字符串除外

时间:2017-02-22 05:19:00

标签: regex lex

我正在尝试编写具有上述特征的字符串的正则表达式。这里,特定字符串是“true”和“false”。例如:“d6”将被接受,但“6d”将不被接受。也不接受“真实”和“虚假”。我已经google了很多,得到了各种各样的例子,但仍然无法做到。请帮忙。

3 个答案:

答案 0 :(得分:1)

如果你真的打算使用lex(或flex),那么你需要将关键字与不同的规则相匹配。

请记住(f)lex应用maximal munch rule:在输入的每个点,匹配的标记是所有模式的最长匹配,因此执行附加到具有最长匹配的模式的规则。此外,如果两个或多个不同的模式都产生相同的最长匹配,则文件中的第一个获胜。

因此,这是您匹配truefalse以外的标识符的方式:

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