Разбить строку по разделителю и пропустить части, где после разделителя следует какой-либо символ - PullRequest
0 голосов
/ 31 октября 2018

Можно ли использовать Regex.Split (), чтобы разделить строку разделителем, но только если за разделителем не следует какой-либо символ. Например, я хотел бы разбить строку по разделителю ":", но игнорировать разделитель ": =". Этот код:

string input = "One : Two:Three:=Four";
string pattern = @":";
Regex reg = new Regex(pattern);
var parts = reg.Split(input):

возвращает 4 части: «Один», «Два», «Три» и «= Четыре».

Я попытался изменить образец следующим образом:

string input = "One : Two:Three:=Four";
string pattern = @":[^=]";
Regex reg = new Regex(pattern);
var parts = reg.Split(input):

Теперь я получаю 3 части: «Один», «Два» и «hree: = Четыре». Что должно быть изменено в шаблоне, чтобы правильно начать начало третьей части, например: «Три: = Четыре».

Как насчет дополнения приведенного выше примера дополнительным определением начального / конечного разделителя, которое также отключает разделение по определенному разделителю. Например:

string input = "One : Two:Three:=Four {Comment:String:="This is a comment";AddditionalInfo:String:="This is some additional info";}";

Результат должен содержать следующие 3 части: «Один», «Два» и «Три: = Четыре {Комментарий: Строка: =« Это ...} ».

Я имею в виду, что разделитель ":" должен игнорироваться, если он присутствует между разделителями "{" и "}".

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Вы можете разделить с помощью:

:(?!=)(?![^{]*})
0 голосов
/ 31 октября 2018

Вы можете использовать отрицательный взгляд позади (?<! и отрицательный взгляд вперед (?!, чтобы утверждать, что двоеточие не находится между фигурными скобками.

Чтобы убедиться, что за двоеточием не стоит знак равенства, вы также можете использовать отрицательный прогноз.

(?<!\{[^{}]*):(?!=)(?![^{}]*})

Regex demo

Объяснение

  • (?<! Отрицательный взгляд сзади, чтобы проверить, что слева не
    • \{[^{}]* Совпадение { с последующим совпадением 0+ раз, а не { или }
  • ) Закрыть группу без захвата
  • :(?!=) Соответствует двоеточию, если последующее не является знаком равенства
  • (?! Отрицательный взгляд
    • [^{}]*} Совпадение 0+ раз, а не { или }, за которым следует сопоставление }
  • )

Используя ваш пример, это выглядело бы так:

string input = "One : Two:Three:=Four";
string pattern = @"(?<!\{[^{}]+):(?!=)(?![^{}]+})";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);

Демонстрация C #

0 голосов
/ 31 октября 2018

Использование:

:(?!=)

Ваш код должен выглядеть так:

string input = "One : Two:Three:=Four";
string pattern = @":(?!=)";
Regex reg = new Regex(pattern);
var parts = reg.Split(input);

Для второй части вашего вопроса вы можете сначала удалить те из них, которые находятся между {}, а затем разделить их:

input = Regex.Replace(input, @"\{[^}]*\}", "");

Демонстрационная версия

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