在空格上拆分字符串忽略括号

时间:2014-03-19 05:02:52

标签: c# regex string

我有一个像这样的字符串

(ed) (Karlsruhe Univ. (TH) (Germany, F.R.))

我需要把它分成两个,比如这个

ed
Karlsruhe Univ. (TH) (Germany, F.R.)

基本上,忽略括号内的空格和括号

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

4 个答案:

答案 0 :(得分:1)

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

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);
}

ideone demo

故障:

\((                     # 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

答案 1 :(得分:0)

\((.*?)\)\s*\((.*)\)

您将获得两个匹配组\ 1和\ 2

中的两个值

演示:http://regex101.com/r/rP5kG2

如果您使用模式\1\n\2进行搜索和替换,那么

this就是您所需要的,而这似乎也是您需要的模式

答案 2 :(得分:0)

string str = "(ed) (Karlsruhe Univ. (TH) (Germany, F.R.))";
Regex re = new Regex(@"\((.*?)\)\s*\((.*)\)");

Match match = re.Match(str);

答案 3 :(得分:0)

一般来说,没有 您无法在正则表达式中描述递归模式。 (因为它不可能用有限的自动机识别它。)