我是正则表达式的新手,想要使用一个来搜索我们的源代码控件,以便在遵循特定枚举值的代码块中查找文本。即:
/(\/{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}
我知道我可以使用(\{(/?[^\>]+)\})
来查找块,但我只想要第一个包含我正在寻找的枚举值的代码块。我还注意到,使用(\{(/?[^\>]+)\})
为我提供了第一个{
和最后一个}
,它不会对后续{}
进行分组。
谢谢! 蒂姆
答案 0 :(得分:6)
Regexps根本无法处理这种东西。为此,您需要一个解析器和扫描仪。
答案 1 :(得分:0)
正如其他人所暗示的那样,在数学上不可能使用正则表达式(至少在一般情况下;如果你有高度专业化的案例,你可能能够使它工作)。如果你想坚持使用标准的Unix工具,或者只是去Perl,Python,Ruby等,并尝试建立你需要的词法解析,尝试使用lex和awk的组合来获得理想的结果。
答案 2 :(得分:0)
虽然嵌套是一个问题,但您可以使用回溯和前瞻来有效地计算匹配的大括号或引号。这不是正则表达式的严格组成部分,但已添加到许多正则表达式库中,例如.NET,perl和java中的库;可能更多。我不建议你走这条路,因为你应该发现它更容易从词汇上解析它。但是,如果您尝试将此作为快速修复,请绝对收集一些测试用例并通过regexbuddy或expresso运行。