Javascript中的RegEx match()无法产生预期的结果

时间:2018-12-05 15:25:49

标签: javascript regex

我很难弄清楚为什么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)

我期望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 :(得分:2)

+量词是 greedy ,它将“吃掉”尽可能多的源字符串。您可以改用.+?

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

更好,而不是.匹配“ not]”

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

明确地排除边界字符仍然可以改善性能。

答案 1 :(得分:1)

TL; DR :正则表达式\[(.+?)\]\((.+?)\)应该起作用。

原始模式不起作用的原因是+量词在默认情况下是“贪婪的”,它将尝试匹配尽可能多的字符。因此,.+的意思是“尽可能用除换行符以外的任何东西”。您已经可以说右括号符合定义。

要使其正常工作,您必须说“在第一个右括号之前,尽可能多地讲”。为此,您应该将.+替换为[^\]]+(第二组的[^\)]+),或者通过在前面加上的量词?来使前面的量词不太贪婪,这会将两个捕获组都变成(.+?)