Разбить строку на пробел, игнорируя скобки

У меня есть такая строка

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

Мне нужно разделить его на две части, такие как эта

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

В основном игнорирование пробелов и скобок в скобках

Можно ли использовать регулярное выражение для достижения этой цели?

4 ответа

Решение

Если у вас может быть больше скобок, лучше использовать группы балансировки:

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 демо

Сломать:

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

В общем нет.
Вы не можете описать рекурсивные шаблоны в регулярном выражении. (Поскольку это невозможно распознать с помощью конечного автомата.)

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

Match match = re.Match(str);
\((.*?)\)\s*\((.*)\)

вы получите два значения в двух группах совпадений \1 и \2

Демо здесь: http://regex101.com/r/rP5kG2

и это то, что вы получите, если будете искать и заменять шаблоном \1\n\2 что также, кажется, то, что вам нужно именно

Другие вопросы по тегам