我正在使用flex来解析整个buncha的东西,但是当我试图在同一行上检测到两个字符串文字时,我遇到了一个路障。
我的正则表达式:
["].*["]
是的,我的意思是:
"cats" < "dogs"
被识别为一个长字符串
cats" < "dogs
为什么flex只考虑两个最外层的引用,而不是制作两个单独的集合? 我确定问题在于我的正则表达式,所以我基本上要问的是:
如何编写一个正则表达式,在这种情况下,会识别标记STRING,LESS,STRING而不仅仅是STRING?
答案 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将符合符合以下条件的行:
因为我不知道这些是否是您需要匹配的标准,我将分解这个正则表达式和一些重要的组件。
检查第一个引号后,解析此前瞻子程序:
(?=.*[\"].*[\"].*[\"])
这将在RegEx主题中检查是否还有另外三个引号。它匹配任何后跟引号的东西,三次。您可以通过添加或删除.*[\"]
部分来修改此选项以检查更多或更少的引号。
接下来,我们有另一个前瞻子程序:
(?=.*[\<])
检查第一个和最后一个引号之间至少有一个尖括号。如果您想检查其他操作,可以将其添加到[\<]
的方括号内,如下所示:[\<\>\=\+]
。
最后,我们将所有字符与.+?
匹配一次或多次,然后是最终引号:\"
。
重要的是要注意,先行子程序在进行检查时实际上并不会在字符串中移动。例如,如果我们使用正则表达式/a(?=a)a/
,它将只匹配两个连续的'a'字符,而不是三个。
这就是为什么我上面提到的第一个前瞻试图在第一个之后找到3个引号。
也许不是你想要的答案,但我希望这有点帮助。