然而结果匹配不一样。当匹配位于字符串的开头时,返回字符串,但是当在空格后匹配时,空格也作为匹配的一部分返回;即使使用非捕获结肠。
我使用以下代码测试的是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"]

为什么返回空格?
答案 0 :(得分:3)
(?:^|\s)
中的冒号只是意味着它是一个非捕获组。换句话说,在读取,反向引用或替换捕获的组值时,将不包括它。没有冒号,它可以作为\1
引用,但是对于冒号,没有办法引用它。但是,默认情况下,非捕获组仍包含在匹配中。例如,My (?:dog|cat) is sick
仍会在匹配中包含单词dog
或cat
,即使它是非捕获组。
要使其排除该值,您有两个选择。如果你的正则表达式引擎支持负面的后视,你可以使用那些,例如(?!<^|\s)
。如果它没有(并且不幸的是,JavaScript的引擎是其中之一),你可以在你想要的部分周围放置一个捕获组,然后读取该组的值而不是整个匹配(例如,{{1} })。例如:
(?:^|\s)(un)
答案 1 :(得分:1)
一种解决方案是使用捕获组(即。(un)
),以便您可以使用RegExp.prototype.exec()
然后使用此结果的match[1]
来获取匹配的字符串,就像这样:
let str1 = "un ejemplo";
let str2 = "ejemplo uno";
let reg = /(?:^|\s)(un)/gi;
var match1 = reg.exec(str1);
var match2 = reg.exec(str2);
console.log(match1[1]); // ["un"]
console.log(match2[1]); // ["un"]