我已经在this question中看到了这个答案。
但是结果匹配并不相同。当匹配位于字符串的开头时,返回字符串,但是当在空格之后匹配时,空格也会作为匹配的一部分返回;即使使用非捕获冒号。
我在Firefox控制台使用以下代码进行了测试:
let str1 = "un ejemplo";
let str2 = "ejemplo uno";
let reg = /(?:^|\s)un/gi;
console.log(str1.match(reg)); // ["un"]
console.log(str2.match(reg)); // [" un"]
为什么返回空格?
最佳答案
(?:^|\s)
中的冒号只是意味着它是一个非捕获组。换句话说,当读取、反向引用或替换捕获的组值时,它不会被包含在内。如果没有冒号,则可以将其引用为 \1
,但是对于冒号,没有办法引用它。但是,默认情况下,非捕获组仍包含在比赛中。例如My (?:dog|cat) is sick
仍将包含单词 dog
或cat
在比赛中,即使是非捕获组。
要使其排除该值,您有两种选择。如果您的正则表达式引擎支持负向后查找,您可以使用其中的一个,例如 (?!<^|\s)
。如果没有(不幸的是,JavaScript 的引擎是不这样做的引擎之一),您可以在您想要的部分周围放置一个捕获组,然后读取该组的值而不是整个匹配(例如, (?:^|\s)(un)
) 。例如:
let reg = /(?:^|\s)(un)/gi;
let match = reg.exec(input)
let result = match[1];
关于JavaScript 单词边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46342395/