JavaScript Regex: сделать нелицеприятный - PullRequest
2 голосов
/ 15 февраля 2010

У меня есть это регулярное выражение, которое ищет %{any charactering including new lines}%:

/[%][{]\s*((.|\n|\r)*)\s*[}][%]/gm

Если я проверю регулярное выражение на строке типа "% {hey}%", регулярное выражение возвращает "hey" в качестве совпадения.

Однако, если я дам ему "% {hey} %% {there}%", он не будет совпадать с обоими "hey" и "there" по отдельности, у него будет одно совпадение - "hey} %%{там ".

Как мне сделать так, чтобы он возвращал соответствие каждому% {}%?

Ответы [ 3 ]

5 голосов
/ 15 февраля 2010

Добавьте знак вопроса после звезды.

/[%][{]\s*((.|\n|\r)*?)\s*[}][%]/gm
3 голосов
/ 15 февраля 2010

Во-первых, чтобы подстановочный знак не был жадным, просто добавьте его с помощью ? (поэтому *? вместо * и +? вместо +).

Во-вторых, ваш шаблон можно упростить несколькими способами.

/%\{\s*([\s\S]*?)\s*\}%/gm

Нет необходимости заключать один символ в квадратные скобки.

Наконец, выражение в центре, которое вы хотите захватить, вы заметите, что я поставил [\s\S]. Это происходит от Соответствие строк в JavaScript в качестве замены поведения DOTALL.

1 голос
/ 15 февраля 2010

Короче и быстрее работает:

/%\{([^}]*)\}%/gm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...