RegEx match () в Javascript не дает ожидаемого результата - PullRequest
0 голосов
/ 05 декабря 2018

Мне трудно понять, почему регулярное выражение в Javascript не работает так, как я ожидаю.

Шаблон выглядит следующим образом:

\[(.+)\]\((.+)\)

пытается сопоставить текств следующем формате:

[Learn more](https://www.example.com)

const text = 'Lorem ipsum etc [Learn more](https://www.google.com), and produce costly [test link](https://www.google.com). [another test link](https://www.google.com).'

const regex = /\[(.+)\]\((.+)\)/
const found = text.match(regex)
console.log(found)

Я ожидаю, что найденное значение будет следующим:

[
    "[Learn more](https://www.google.com)",
    "[test link](https://www.google.com)",
    "[another test link](https://www.google.com)"
]

Но значение выглядит следующим образом:

[
    "[Learn more](https://www.google.com), and produce costly [test link](https://www.google.com). [another test link](https://www.google.com)",
    "Learn more](https://www.google.com), and produce costly [test link](https://www.google.com). [another test link",
    "https://www.google.com"
]

Я пробовал флаги / ig, но, похоже, это не работает.Я пытаюсь в другом приложении (RegExRX) и получаю ожидаемый результат, но в Javascript я не могу заставить его получить тот же результат.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

TL; DR : регулярное выражение \[(.+?)\]\((.+?)\) должно сработать.

Причина, по которой исходный шаблон не работает, заключается в том, что квантор + по умолчанию "жадный" -он будет пытаться сопоставить как можно больше символов.Следовательно, .+ означает «как можно больше из всего, кроме символа новой строки ».Вы уже можете сказать, что закрывающая скобка точно соответствует определению.

Чтобы она работала правильно, вы должны сказать «как можно больше, до первой закрывающей скобки».Чтобы сделать это, вы должны либо заменить .+ на [^\]]+ ([^\)]+ для второй группы), либо просто сделать вышеупомянутый квантификатор не слишком жадным, добавив его с ?, что превращает обе группы захвата в (.+?).

0 голосов
/ 05 декабря 2018

Квантор + имеет значение жадный и будет "съедать" как можно большую часть исходной строки.Вместо этого вы можете использовать .+?:

const regex = /\[(.+?)\]\((.+?)\)/

Еще лучше, вместо . сопоставить "not]":

const regex = /\[([^\]]+)\]\(([^)]+)\)/

Явное исключение ограничивающих символов может работать в любом случае лучше.

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