Regex.Split на «пробел без кавычек», возвращающий повторяющиеся строки - PullRequest
0 голосов
/ 27 марта 2019

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

  1. Пробелы (\s+)
  2. Не цитируется "

    2-а. игнорировать сбежал " (игнорировать \")

Согласно regexr.com и regex101.com (ссылка на тестовый код), где я создал эту строку, с этим, как я понимаю, проблем не возникало.

С учетом кода:

Regex.Split("lorem \"ipsum door?!\" sit?! amet!!!", @"(?<=^(\\""|[^""])*((?<!\\)""(\\""|[^""])*((?<!\\)""))*(\\""|[^""])*)\s+")
//(?<=^(\\"|[^"])*((?<!\\)"(\\"|[^"])*((?<!\\)"))*(\\"|[^"])*)\s+

Ожидаемый:

lorem
"ipsum door?!"
sit?!
amet!!!

Возвращает:

lorem
l
"ipsum door?!"
l
"ipsum door?!"
i
"
sit?!
l
"ipsum door?!"
i
"

amet!!!

Дополнительная информация: перед добавлением условия 2-a (игнорировать \") я придумал это и столкнулся с аналогичной проблемой. Код / результат: https://pastebin.com/76eKp1wb

1 Ответ

0 голосов
/ 27 марта 2019

Мне удалось получить требуемый результат с опцией RegexOptions.ExplicitCapture

Примерно так:

Regex splitter = new Regex(@"(?<=^(\\""|[^""])*((?<!\\)""(\\""|[^""])*((?<!\\)""))*(\\""|[^""])*)\s+", RegexOptions.ExplicitCapture);
var lineBreak = splitter.Split("lorem \\\"ipsum \\\" door?!\" sit?! \" amet!!!");

Видимо, когда захват безили с любыми вариантами, нет никакой разницы.Другими словами, только при разделении возникает проблема.

Мое лучшее предположение - библиотека пытается захватить что-то в группе захвата и пытается разделить там.

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