Regex.Split строка на подстроки разделителем при сохранении пробела - PullRequest
1 голос
/ 30 марта 2019

Я создал Regex, чтобы разделить строку разделителем ($), но он работает не так, как я хочу.

var str = "sfdd fgjhk fguh      $turn.bak.orm $hahr*____f";
var list = Regex.Split(str, @"(\$\w+)").Where(x => !string.IsNullOrEmpty(x)).ToList();

foreach (var item in list)
{
    Console.WriteLine(item);
}

Выход:

"sfdd fgjhk fguh      "
"$turn"
".bak.orm "
"$hahr"
"*____f"

Проблема в том, что \w+ не соответствует ни периодам, ни звездам. Вот вывод, который я хочу:

"sfdd fgjhk fguh      "
"$turn.bak.orm"
" "
"$hahr*____f"

По сути, я хочу разделить строку на $ и убедиться, что $ появляется в начале подстроки и больше нигде (допустимо, чтобы подстрока была только $). Я также хочу убедиться, что пробельные символы сохраняются, как в первой подстроке, но любое совпадение не должно содержать пробелов, как во втором и четвертом случаях. Меня не волнует чувствительность к регистру.

1 Ответ

1 голос
/ 30 марта 2019

Похоже, вы хотите разделить с шаблоном, который начинается с доллара, а затем имеет любые 0 или более символов, кроме пробелов и долларовых символов:

var list = Regex.Split(s, @"(\$[^\s$]*)")
        .Where(x => !string.IsNullOrEmpty(x))
        .ToList();

Подробности

  • ( - начало группы захвата (чтобы Regex.Split маркировал строку, мог сохранить совпадения в результирующем массиве)
    • \$ - знак доллара
    • [^\s$]* - класс отрицательных символов, соответствующий 0 или более символам, кроме пробелов (\s) и символов доллара
  • ) - конец группы захвата.

См. Демонстрационную версию regex :

enter image description here

Чтобы включить второй разделитель, вы можете использовать@"([€$][^\s€$]*)".

...