C# 正则表达式匹配模式问题
我的正则表达式并不是我想要的。它需要在我的文本文件中查找所有匹配项,其中该行以:C# 正则表达式匹配模式问题,c#,regex,string,match,C#,Regex,String,Match,我的正则表达式并不是我想要的。它需要在我的文本文件中查找所有匹配项,其中该行以: func anyword() { 模式将执行此操作,但我希望它在下一个}时停止。但如果出现以下一种或多种情况: SomeFunction(); 它应该跳过下一个} 下面是它将扫描的文本示例。每一行都会被注释以显示它应该在那里做什么: override func something() { // here is a start pattern /
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+\}
一种可能的解决方案是,您必须使用点的单行匹配来匹配换行符:
func\s*.*\s*{\n.*?((?!\{.*\}).)*}
这里匹配func关键字和第一个左括号。然后,使用一个负的前瞻,不允许在该行上有另一个左括号,后面跟着要查找的右括号
您甚至可以嵌套更多的开始/结束括号,它将匹配最后一个结束括号
你可以测试一下
有关详细信息,请参见如果只有一层嵌套括号,则此模式适用于您:
\w[\w\s]+func[\w\s()]+({(?:[^{}]*|[\w\s();]*?{[\w\s();]*?}[\w\s();]*?)*})
可能是用来(处理那些讨厌的嵌套的、未知级别的
{}
:
\bfunc\s*\w+\([^)]*\)\s*{(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)\}
\bfunc\s*\w+\([^)]*\)\s*{(?:[^{}]|((?{)(?}))*(?(打开)(?!)\}
最酷的部分是
(?:[^{}]|((?{)(?}))*(?(Open)(?!)
,它的意思是:吃一个非{}
,或者吃一个{
,最后是一个}
,这是三向交替中的第三个选项(注意减号,名称无关紧要),这会弹出堆栈并“关闭”组。由于*
,此子模式可以自由匹配尽可能多的次,但任何{
都必须由相同数量的}
匹配,否则模式将通过最后一个条件失败,该条件检查“打开”组,如果它仍然保留任何匹配项,则执行一个空的前瞻,保证整个操作失败。regex没有现成的配置来匹配任意数量的嵌套构造。但是.net regex只是为了这样做而扩展regex:当我将其放入时,它不匹配任何内容。您指定“^”对于func
位于字符串开头,但在给定的示例数据中,它不在字符串开头。“行以开头”=>RegexOptions。多行
然后需要澄清,因为样本数据显然与这种情绪不匹配。你是对的,样本数据与OP所作的陈述不匹配。也许a\b
允许覆盖
等…更新。这个\bfunc\s*\w+\([^]*\)\s*{{(?:[^{}]}.(?{}.[124;(?}])*}
不正确,因为没有条件检查打开堆栈的值和失败的前瞻。