正则表达式问题匹配模式

时间:2017-01-14 20:11:52

标签: c# regex string match

我的正则表达式并没有真正按照我的意愿行事。它需要在我的文本文件中找到所有匹配的行:

func anyword() {

模式会执行此操作,但我希望它在下一个}停止。但如果出现其中一个或多个:

SomeFunction();  

它应该跳过下一个}

以下是扫描文本的示例。每行都有注释,以显示它应该在那里做什么:

override func something() {   // here is a start pattern
                              // still looking for an }
halloworld() { };             // bracket } found but is ignored because line also contains "()"
                              // still looking for an } 
                              // still looking for an }
}                             // found closing bracket } end of match

这是我目前使用的模式:

\w+\s+func\s\w+\(\)\{\s+(.*?)\s+\}

3 个答案:

答案 0 :(得分:2)

也许是利用here的东西(处理那些讨厌的嵌套,未知级别的{}

\bfunc\s*\w+\([^)]*\)\s*{(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)\}

很酷的部分是(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)它转换为:吃一个非{},或吃一个{,最后是},第三个选项在三向交替中(注意减号,名称无关紧要),这会弹出堆栈并且&#34;关闭&#34;群组。由于*,此子模式可以尽可能多地匹配,但任何{都必须匹配相同数量的},否则模式将失败通过最后一个条件,检查&#34;打开&#34;如果它仍保持任何匹配,则执行一个空的预测,保证整个事情都失败。

答案 1 :(得分:0)

一个可能的解决方案是,你必须使用单行匹配点来匹配换行符:

func\s*.*\s*{\n.*?((?!\{.*\}).)*}

这里匹配func关键字和第一个左括号。然后,使用负向前瞻,不允许该行上的另一个左括号,后面是您要查找的右括号。

你甚至可以嵌套更多的开/关括号,它将匹配最后一个右括号。

您可以对其进行测试here

有关详细信息,请参阅this question

答案 2 :(得分:0)

如果只有一个级别的嵌套括号,那么这个模式应该适合你:

\w[\w\s]+func[\w\s()]+({(?:[^{}]*|[\w\s();]*?{[\w\s();]*?}[\w\s();]*?)*})

See it implemented on Regex101.