flex中的多个String文字

时间:2015-02-27 10:06:28

标签: regex string lex flex-lexer string-literals

我正在使用flex来解析整个buncha的东西,但是当我试图在同一行上检测到两个字符串文字时,我遇到了一个路障。

我的正则表达式:

["].*["]
是的,我的意思是:

"cats" < "dogs"

被识别为一个长字符串

cats" < "dogs

为什么flex只考虑两个最外层的引用,而不是制作两个单独的集合? 我确定问题在于我的正则表达式,所以我基本上要问的是:

如何编写一个正则表达式,在这种情况下,会识别标记STRING,LESS,STRING而不仅仅是STRING?

2 个答案:

答案 0 :(得分:4)

我想你正在使用这样的模式:

["].*["]              { return STRING; }

或者

["].*?["]             { return STRING; }

第一个不会起作用,因为flex总是进行最长的匹配,而使用最后一个&#34; 的匹配显然更长。第二个在正则表达式库中是正确的,它实现了非贪婪的重复,但flex没有;在flex中,.*?只是一个可选的.*(也就是说,?是一个无操作。)

您真正想要的是匹配除引号之外的字符串。所以你可以这样说:

["][^"]*["]           { return STRING; }
[^"]不同,

.会匹配换行符。如果您不想要多行字符串,则必须使用[^"\n]

显然,上面的内容并不允许&#34; 出现在字符串中,这迟早会令人讨厌。这个问题的两个流行的解决方案是(C风格)允许 \ 到&#34;逃避&#34;下一个字符:("a \" in a string"

["]([^"]|\\.)*["]     { return STRING; }

或(SQL风格)要求内部&#34; 加倍:(&#34; a&#34;&#34;在字符串中&#34;`)< / p>

["]([^"]|["]["])*["]  { return STRING; }

答案 1 :(得分:1)

说实话,我不确定为什么flex正在做它是什么。但要回答关于如何编写RegEx以检测此案例的问题:

/^\"(?=.*[\"].*[\"].*[\"])(?=.*[\<]).+?\"$/

此RegEx将符合符合以下条件的行:

  • 以引号开头和结尾
  • 在第一个之后包含3个引号(表示该行包含两个字符串)
  • 仅包含一个尖括号

因为我不知道这些是否是您需要匹配的标准,我将分解这个正则表达式和一些重要的组件。

检查第一个引号后,解析此前瞻子程序:

(?=.*[\"].*[\"].*[\"])

这将在RegEx主题中检查是否还有另外三个引号。它匹配任何后跟引号的东西,三次。您可以通过添加或删除.*[\"]部分来修改此选项以检查更多或更少的引号。

接下来,我们有另一个前瞻子程序:

(?=.*[\<])

检查第一个和最后一个引号之间至少有一个尖括号。如果您想检查其他操作,可以将其添加到[\<]的方括号内,如下所示:[\<\>\=\+]

最后,我们将所有字符与.+?匹配一次或多次,然后是最终引号:\"

重要的是要注意,先行子程序在进行检查时实际上并不会在字符串中移动。例如,如果我们使用正则表达式/a(?=a)a/,它将只匹配两个连续的'a'字符,而不是三个。

这就是为什么我上面提到的第一个前瞻试图在第一个之后找到3个引号。

也许不是你想要的答案,但我希望这有点帮助。