我的正则表达式并没有真正按照我的意愿行事。它需要在我的文本文件中找到所有匹配的行:
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+\}
答案 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();]*?)*})