Разделение регулярного выражения на новую строку вне кавычек - PullRequest
0 голосов
/ 14 июля 2020

Я хочу разделить поток данных на новые строки, НЕ заключенные в двойные кавычки. Поток содержит строки данных, каждая из которых отделяется новой строкой. Однако строки данных потенциально могут содержать символы новой строки в двойных кавычках. Эти новые строки не означают, что началась следующая строка данных, поэтому я хочу их игнорировать.

Таким образом, данные могут выглядеть примерно так:

Строка 1: bla bla, 12345, ...

Ряд 2: «bla

bla», 12345, ...

Ряд 3: bla bla, 12345, ...

Я попытался использовать регулярное выражение из аналогичного сообщения о разделении запятых, не найденных двойными кавычками ( Разделение запятой вне кавычек ), заменив запятую на символ новой строки:

\n(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

Это регулярное выражение не соответствует тому, чего я ожидал. Я что-то упускаю?

1 Ответ

0 голосов
/ 14 июля 2020

Соответствующие символы конца строки, которые не находятся между двойными кавычками, эквивалентны совпадающим символам конца строки, которым предшествует четное количество двойных кавычек от начала строки. Вы можете сопоставить такие терминаторы строки с помощью следующего регулярного выражения (с не установленным флагом многострочного, так что ^ соответствует началу строки, а не началу строки).

/(?<=^[^"]*(?:"[^"]*"[^"]*)*)\r?\n/

Запустите двигатель! Механизм регулярных выражений

Javascript (который впечатляюще поддерживает поиск назад переменной длины) выполняет следующие операции.

(?<=         : begin positive lookbehind
  ^          : match beginning of string (not line)
  [^"]*      : match 0+ chars other than '"'
  (?:        : begin non-capture group
    "[^"]*"  : match '"', 0+ chars other than '"', '"'
    [^"]*    : match 0+ chars other than '"' 
  )*         : end non-capture group and execute 0+ times
)            : end postive lookbehind
\r?\n        : match line terminator
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...