Как заставить регулярное выражение захватывать как можно меньше? - PullRequest
1 голос
/ 17 июня 2020

У меня есть это регулярное выражение: <<button (".*?")>>

У меня есть эта строка: <<button "A string" "Another string">><</button>>

Это полностью соответствует <<button "A string" "Another string">>, и я не хочу. Я хочу, чтобы это не совпадало, потому что есть 2 строки.

Вот несколько примеров того, что я хочу:

<<button "A string" "Another string">><</button>> Нет совпадений

<<button "A string">><</button>> Совпадение

<<button>><</button>> Нет совпадения

Я подумал, что из-за того, что я использовал не жадное регулярное выражение, это будет работать так, как я хотел, но, на мой взгляд, он действует довольно жадно. Я не могу понять, что значит «нежадный». Как мне написать регулярное выражение, которое работает так, как я хочу?

Я использую JavaScript.

1 Ответ

2 голосов
/ 17 июня 2020

Проблема в том, что жадный / не жадный влияет не на то, что совпадает, а что нет, а просто на то, как долго будет совпадать часть. Другими словами, ваша точка . также будет жевать двойные кавычки, если это необходимо для того, чтобы все выражение соответствовало. как можно меньше и вернуться к более длинному.

Вместо этого вам нужно проанализировать строку ... что-то вроде

<<button ("([^"\\]|\\.)*")>>

Значение

  • " двойная кавычка
  • (...)* ноль или более
    • [^"\\] НЕ backsla sh или двойная кавычка
    • | или
    • \\. backsla sh, за которым следует любой символ
  • " двойная кавычка

проблема со строками в том, что они могут содержать двойные кавычки при экранировании с помощью backsla sh, поэтому для синтаксического анализа строки требуется больше, чем просто "([^"]*)".

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