我正在尝试编写正则表达式来标识if语句.我遇到的唯一问题是如果语句在括号中有括号,则会捕获它.例如:
if (condition_function(params)) { statements; }
我的表达式捕获除了这些之外的所有if语句是:
if\s*\(([^\(\)]|\s)*\)\s*{(.|\s)*?}
有谁知道怎么写?
使用正则表达式是不可能的,因为正则表达式只能匹配常规语言,而您尝试解析的语言是无上下文而不是常规表达式(感谢dirkgently和dmckee).
看看WP:正式的语言理论是你感兴趣的...
顺便说一句.你甚至不能检查一个仅由括号组成的表达式,如果它是正确的([[][]]
正确但[]][
不是),这是你上面给出的一个"子问题".
我认为这可行.如果有人看到我不喜欢的东西,就像它不起作用的原因,请回复.
if\s*\(((?:[^\(\)]|\((?1)\))*+)\)\s*{((?:[^{}]|{(?2)})*+)}
现在应该遇到的唯一问题是if语句中是否有if语句.
我已经在每个有效的if语句上对此进行了测试,我认为这可能会破坏它,并且它唯一不起作用的是包含带有不匹配括号的字符串的语句.
更新:我发现上述正则表达式出错.它不会捕获if语句或语句部分中包含具有不匹配括号的字符串的语句.如下例所示:
if (var1 == "("){ echo "{"; }
但是,这是一个有效的if语句.解决方案:
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*
这个正则表达式捕获所有if语句,甚至是包含具有不匹配括号的字符串的语句.
更新:我现在拥有它,以便捕获else和if if附加到if语句的语句.唯一的问题是它返回的捕获组是最后一个,如果在if语句中则是最后一个.希望我也能弄清楚如何解决这个问题.
if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?1)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?2)})*+)}\s*(?:(?:else\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?3)})*+)}\s*)|(?:else\s*if\s*\(((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^\(\)]|\((?4)\))*+)\)\s*{((?:(?:(?:"(?:(?:\\")|[^"])*")|(?:'(?:(?:\\')|[^'])*'))|[^{}]|{(?5)})*+)}\s*))*;
如果你想测试它,这里有一个很棒的网站:http: //gskinner.com/RegExr/
您是否正在尝试编写正则表达式来解析非常规语言?那永远都不会飞.