Regex для разделения текста, содержащего токены - PullRequest
4 голосов
/ 01 июля 2010

Если у меня есть строка, такая как "abcdef {123} ghi {456} kl", я хочу создать регулярное выражение, которое даст мне все разделенные части следующим образом:

abcdef
{123}
ghi
{456}
kl

Я использую этот код, но не могу понять, каким должно быть выражение:

System.Text.RegularExpressions.Regex rex = new System.Text.RegularExpressions.Regex("expression");
foreach (System.Text.RegularExpressions.Match match in rex.Matches(sText).OfType<System.Text.RegularExpressions.Match>())
{
     ...  
}

Ответы [ 2 ]

3 голосов
/ 01 июля 2010

Вы, вероятно, должны использовать using операторы вместо того, чтобы каждый раз выписывать пространство имен полностью. На первый взгляд ваш код выглядит довольно сложным, но когда вы удаляете все пространства имен, он оказывается очень простым. Также OfType не требуется.

Регулярное выражение должно соответствовать как можно большему числу, которое не является открытой скобкой [^{]* или открытой скобкой, текстом и затем закрывающей скобкой {[^}]*} Регулярное выражение для этого:

{[^}]*}|[^{]*

Попробуйте этот код:

string text = "abcdef{123}ghi{456}kl";
Regex regex = new Regex("{[^}]*}|[^{]*");
foreach (Match match in regex.Matches(text))
{
    Console.WriteLine(match.Value);
}

Выход:

abcdef
{123}
ghi
{456}
kl

Примечание: это регулярное выражение не проверяет правильность формата строки, а предполагает, что оно правильно сформировано.

Немного более простой метод - использовать Split вместо Matches и включить группу захвата в регулярное выражение, чтобы разделитель также был включен в вывод:

string text = "abcdef{123}ghi{456}kl";
Regex regex = new Regex("({[^}]*})");
foreach (string part in regex.Split(text))
{
    Console.WriteLine(part);
}

Вывод для этого такой же, как указано выше.

0 голосов
/ 01 июля 2010
([a-z]+)({\d+})([a-z]+)({\d+})([a-z]+)

будет работать, но только если в строке всегда пять частей. Может ли быть меньше / больше пяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...