我很难弄清楚为什么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中,我无法获得相同的结果。
答案 0 :(得分:2)
+
量词是 greedy ,它将“吃掉”尽可能多的源字符串。您可以改用.+?
:
const regex = /\[(.+?)\]\((.+?)\)/
更好,而不是.
匹配“ not]”
const regex = /\[([^\]]+)\]\(([^)]+)\)/
明确地排除边界字符仍然可以改善性能。
答案 1 :(得分:1)
TL; DR :正则表达式\[(.+?)\]\((.+?)\)
应该起作用。
原始模式不起作用的原因是+
量词在默认情况下是“贪婪的”,它将尝试匹配尽可能多的字符。因此,.+
的意思是“尽可能用除换行符以外的任何东西”。您已经可以说右括号符合定义。
要使其正常工作,您必须说“在第一个右括号之前,尽可能多地讲”。为此,您应该将.+
替换为[^\]]+
(第二组的[^\)]+
),或者通过在前面加上的量词?
来使前面的量词不太贪婪,这会将两个捕获组都变成(.+?)
。