Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式匹配模式问题_C#_Regex_String_Match - Fatal编程技术网

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;(?}])*}
不正确,因为没有条件检查打开堆栈的值和失败的前瞻。