C# 在空白处拆分字符串忽略括号

C# 在空白处拆分字符串忽略括号,c#,regex,string,C#,Regex,String,我有一根这样的绳子 (ed) (Karlsruhe Univ. (TH) (Germany, F.R.)) ed Karlsruhe Univ. (TH) (Germany, F.R.) 我需要像这样把它一分为二 (ed) (Karlsruhe Univ. (TH) (Germany, F.R.)) ed Karlsruhe Univ. (TH) (Germany, F.R.) 基本上,忽略括号中的空格和括号 是否可以使用正则表达式来实现这一点 \((.*?)\)\s*\((.*)\)

我有一根这样的绳子

(ed) (Karlsruhe Univ. (TH) (Germany, F.R.))
ed
Karlsruhe Univ. (TH) (Germany, F.R.)
我需要像这样把它一分为二

(ed) (Karlsruhe Univ. (TH) (Germany, F.R.))
ed
Karlsruhe Univ. (TH) (Germany, F.R.)
基本上,忽略括号中的空格和括号

是否可以使用正则表达式来实现这一点

\((.*?)\)\s*\((.*)\)
您将在两个匹配组\1和\2中获得这两个值

此处演示:


如果您搜索并替换为模式
\1\n\2
,您会得到这样的结果,这似乎也是您所需要的

如果您可以有更多的括号,最好使用平衡组:

string text = "(ed) (Karlsruhe Univ. (TH) (Germany, F.R.))";
var charSetOccurences = new Regex(@"\(((?:[^()]|(?<o>\()|(?<-o>\)))+(?(o)(?!)))\)");
var charSetMatches = charSetOccurences.Matches(text);
foreach (Match match in charSetMatches)
{
    Console.WriteLine(match.Groups[1].Value);
}
string text=“(ed)(卡尔斯鲁厄大学(TH)(德国联邦共和国)”;
var charsetoccurrences=newregex(@“\((((?:[^())))\((?\()))+((?(o)(?!)))\)”;
var charSetMatches=charsetoccurrences.Matches(文本);
foreach(charSetMatches中的匹配)
{
Console.WriteLine(match.Groups[1].Value);
}

细分:

\((                     # First '(' and begin capture
    (?:                 
    [^()]               # Match all non-parens
    |
    (?<o> \( )          # Match '(', and capture into 'o'
    |
    (?<-o> \) )         # Match ')', and delete the 'o' capture
    )+
    (?(o)(?!))          # Fails if 'o' stack isn't empty

)\)                     # Close capture and last opening brace
\(#First'()并开始捕获
(?:                 
[^()]#匹配所有非参数
|
(?\()匹配“(”,并捕捉到“o”
|
(?\)#Match'),并删除“o”捕获
)+
(?(o)(?!)#如果“o”堆栈不是空的,则失败
)\)#关闭捕捉和最后一个打开支架
一般来说,没有。

您不能用正则表达式描述递归模式。(因为用有限自动机无法识别它。)

谢谢!它按预期工作。是的,您是对的。可能有任意数量的括号组。