正则表达式 - 如何在块中查找特定文本?

时间:2009-09-11 19:28:07

标签: regex

我是正则表达式的新手,想要使用一个来搜索我们的源代码控件,以便在遵循特定枚举值的代码块中查找文本。即:

/(\/{2}\@debug)(.|\s)*?(\/{2}\@end-debug).*/
var junk = dontWantThis if (junk) {dont want this} if ( **myEnumValue** ) **{ var yes = iWantToFindThis if (true) { var yes2 = iWantThisToo } }**
var junk2 = dontWantThis if (junk) {dont want this}  
var stuff = dontWantThis if (junk) {dont want this} if ( enumValue ) { wantToFindThis }
var stuff = iDontWantThis if (junk) {iDontWantThisEither}

我知道我可以使用(\{(/?[^\>]+)\})来查找块,但我只想要第一个包含我正在寻找的枚举值的代码块。我还注意到,使用(\{(/?[^\>]+)\})为我提供了第一个{和最后一个},它不会对后续{}进行分组。

谢谢! 蒂姆

3 个答案:

答案 0 :(得分:6)

Regexps根本无法处理这种东西。为此,您需要一个解析器和扫描仪。

答案 1 :(得分:0)

正如其他人所暗示的那样,在数学上不可能使用正则表达式(至少在一般情况下;如果你有高度专业化的案例,你可能能够使它工作)。如果你想坚持使用标准的Unix工具,或者只是去Perl,Python,Ruby等,并尝试建立你需要的词法解析,尝试使用lex和awk的组合来获得理想的结果。

答案 2 :(得分:0)

虽然嵌套是一个问题,但您可以使用回溯和前瞻来有效地计算匹配的大括号或引号。这不是正则表达式的严格组成部分,但已添加到许多正则表达式库中,例如.NET,perl和java中的库;可能更多。我不建议你走这条路,因为你应该发现它更容易从词汇上解析它。但是,如果您尝试将此作为快速修复,请绝对收集一些测试用例并通过regexbuddyexpresso运行。

相关问题