当前位置:  开发笔记 > 编程语言 > 正文

用于识别语句的正则表达式

如何解决《用于识别语句的正则表达式》经验,为你挑选了3个好方法。

我正在尝试编写正则表达式来标识if语句.我遇到的唯一问题是如果语句在括号中有括号,则会捕获它.例如:

if (condition_function(params)) {
     statements;
}

我的表达式捕获除了这些之外的所有if语句是:

 if\s*\(([^\(\)]|\s)*\)\s*{(.|\s)*?}

有谁知道怎么写?



1> Johannes Wei..:

使用正则表达式是不可能的,因为正则表达式只能匹配常规语言,而您尝试解析的语言是无上下文而不是常规表达式(感谢dirkgently和dmckee).

看看WP:正式的语言理论是你感兴趣的...

顺便说一句.你甚至不能检查一个仅由括号组成的表达式,如果它是正确的([[][]]正确但[]][不是),这是你上面给出的一个"子问题".



2> Koukaakiva..:

我认为这可行.如果有人看到我不喜欢的东西,就像它不起作用的原因,请回复.

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/



3> Ken..:

您是否正在尝试编写正则表达式来解析非常规语言?那永远都不会飞.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有