Совпадение всего между двумя символами, кроме случаев, когда есть пустая строка - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь найти шаблон регулярного выражения, который соответствует всем между одним или двумя знаками доллара, \$.*\$|\${2}.*\${2}, за исключением случаев, когда есть пустая строка (это либо две, либо одна, не может быть так: \$.*\$\$). Ниже я приведу примеры того, что я хочу сопоставить и что я хочу пропустить. Совпадение должно включать / исключать все.

Примеры того, что я хочу сопоставить:

$$ \abc + ko$$
$*-ls$

Здесь один знак доллара имеет перед собой символ экранирования, поэтому он не будет разорвать матч они связаны одним $ или двумя $ с каждой стороны, если только между ними нет (являются) пустые строки.


До сих пор я выяснил, как сопоставить те, которые встречаются в одном строки, но я изо всех сил пытаюсь включить разрыв строки и исключить их, если вся строка пуста.

Вот что у меня есть:

^\${2}.*[^\\$]\${2}$|^\$.*[^\\$]\$$

Демо

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Вы можете использовать

/^[^\S\r\n]{0,3}(\${1,2})(?:(?!\1|^$)[\s\S])+?\1[^\S\r\n]*$/gm

См. Демоверсию regex

Подробности

  • ^ - начало строки (поскольку m соответствует ^ совпадению начальных позиций линии)
  • [^\S\r\n]{0,3} - от нуля до трех вхождений любого пробела, кроме CR и LF
  • (\${1,2}) - Группа 1, содержащая один или два $ символа
  • (?:(?!\1|^$)[\s\S])+? - любой символ ([\s\S]), 1 или более экземпляров, но как можно меньше (из-за ленивого +? квантора), что не начинается та же последовательность, что и в группе 1 (\1), и позиция между двумя символами разрыва строки (^$)
  • \1 - то же значение, что и в группе 1 ($ или $$)
  • [^\S\r\n]* - ноль или более вхождений любого пробела, кроме CR и LF
  • $ - конец строки (поскольку m соответствует ^ совпадению начальные позиции линии)
2 голосов
/ 19 марта 2020

В качестве примера вы можете использовать

(?<!\S)(\$\$?+)[^\r\n$]*(?:\$(?!\$)[^\r\n$]*)*(?:\r?\n(?![^\S\r\n]*$)[^\r\n$]*(?:\$(?!\$)[^\r\n$]*)*)*\1(?!\S)

Пояснение

  • (?<!\S) Утвердить границу пробела слева
  • (\$\$?+) Захват группы 1, соответствует $ или $$, где второй является притяжательным (не допускать обратного отслеживания)
  • [^\r\n$]*(?:\$(?!\$)[^\r\n$]*)* Соответствует любому символу, кроме $ или новой строки или $, когда непосредственно не следует другой $
  • (?: Группа без захвата
    • \r?\n(?![^\S\r\n]*$) Соответствует новой строке, не утверждая, что строка состоит только из пробелов
    • [^\r\n$]*(?:\$(?!\$)[^\r\n$]*)* То же, что и выше
  • )* Закрыть группу и повторить 0+ раз
  • \1 Обратная ссылка на то, что записано в группе 1
  • (?!\S) Утвердить граница пробелов справа

Regex demo

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