Использование регулярных выражений в Sublime Text приводит к исчерпанию ошибки пространства стека - PullRequest
0 голосов
/ 16 сентября 2018

В возвышенном тексте я пытаюсь сопоставить одинарную двойную кавычку с html-тегом <br>. После html-тега может следовать любая строка, и двойной кавычке не должно предшествовать двойная кавычка.

Я дошел до того, что мое регулярное выражение соответствовало моим ожиданиям при тестировании в https://regex101.com/r/HHNB1E/4.

Это мое регулярное выражение: ^((?!").)*{"<br>}.*$.

Однако, когда я помещаю это в Sublime Text, он выдает ошибку «Недостаточно места в стеке, пытающееся соответствовать регулярному выражению». Я предполагаю, что мое регулярное выражение неэффективно, учитывая, что я не очень опытен с ними.

Пример ожидаемых результатов:

foobar""<br> - Нет совпадений

foobar"<br> - Матч

""<br>baz - Нет совпадений

"<br>baz - Матч

foo<br>baz - без совпадений

Нужно ли улучшать регулярное выражение для повышения эффективности или я делаю это совершенно неправильно?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Ошибка, которую вы видите, скорее всего, связана с захватом группы. Преврати его в группу без захвата, как это:

^(?:(?!").)*"<br>.*$

Но ...

Я пытаюсь найти одинарную двойную кавычку ...

Если вы пытаетесь сопоставить одну двойную кавычку, за которой сразу следует <br>, а перед ней не стоит ", то, скорее всего, вам нужны обходные пути:

"(?<!"")(?=<br>)

Это быстрое решение вашей проблемы.

0 голосов
/ 16 сентября 2018

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

^[^"]*"<br>.*$

Демо

Регулярное выражение может быть еще более упрощеноесли вам не нужно выделять всю строку: [^"]"<br>

Если вам нужна полная строка, а вышеперечисленное не работает, я бы рекомендовал запустить шаблон через grep

grep -P '^[^"]*"<br>.*$'
...