JavaScript 单词边界

标签 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"]

为什么返回空格?

最佳答案

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

要使其排除该值,您有两种选择。如果您的正则表达式引擎支持负向后查找,您可以使用其中的一个,例如 (?!<^|\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/

相关文章:

javascript - Ajax 未捕获类型错误 : Illegal invocation

c# - 使用 C# 使用数据库中的新数据每 1 分钟更新一次 Google Maps Javascript 对象?

JavaScript 做了一些奇怪的事情?可以在 IE 下运行,但不能在 Firefox 下运行?

c# - 查找文本小写或大写

java - 此正则表达式错误 : var worksheet = (. *)\\};

javascript - Sails.js 正则表达式路由

javascript - 如何删除 extjs 中的按钮背景?

python - 我怎样才能用正则表达式标记这个?

php - 自动链接正则表达式

c# - 在关键字后获得 2 个换行符