Javascript字边界

时间:2017-09-21 11:09:42

标签: javascript regex

我在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"]




为什么返回空格?

2 个答案:

答案 0 :(得分:3)

(?:^|\s)中的冒号只是意味着它是一个非捕获组。换句话说,在读取,反向引用或替换捕获的组值时,将不包括它。没有冒号,它可以作为\1引用,但是对于冒号,没有办法引用它。但是,默认情况下,非捕获组仍包含在匹配中。例如,My (?:dog|cat) is sick仍会在匹配中包含单词dogcat,即使它是非捕获组。

要使其排除该值,您有两个选择。如果你的正则表达式引擎支持负面的后视,你可以使用那些,例如(?!<^|\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"]