从javascript正则表达式中的单词边界中排除一些字符

时间:2017-04-13 19:54:03

标签: javascript regex

days = /\b\d{2}\b/; date = /\b\d{4}-\d{2}-\d{2}\b/;

2020-12-22应该与日期匹配,而不是天,但它匹配两者。 是否有可能使\ b不将-视为单词边界?

1 个答案:

答案 0 :(得分:2)

您当前的问题有几个问题。

  

是否可以将\b视为字边界?

探索边界部分中查看有关字边界的this tchrist's answer。这就是它的工作原理,并且没有办法重新定义\b行为。

  

2020-12-22应与日期匹配,而不是天,但它与两者都匹配。

为了匹配日期并避免将日期与days正则表达式匹配,您需要lookbehind和lookahead - /\b(?<!-)\d{2}\b(?!-)/ - 但JavaScript正则表达式不支持lookbehind构造。您所能做的只是使用消费模式,它将匹配字符串的开头或任何字符,但连字符 - (?:^|[^-]),并使用\d{2}周围的捕获组来< em>将捕获到一个单独的组中。请注意,根据您的操作,您可能还需要在lookbehind变通方法模式中使用捕获组。

如果您打算提取,请使用

var days = /(?:^|[^-])\b(\d{2})\b(?!-)/g;
var s = "25 and 45 on 2017-04-14 and 2017-04-15.";
var res = [], m;
while ((m=days.exec(s)) !== null) {
  res.push(m[1]);
}
console.log(res)

要替换它们,请使用

var days = /(^|[^-])\b(\d{2})\b(?!-)/g;
var s = "25 and 45 on 2017-04-14 and 2017-04-15.";
console.log(s.replace(days, "$1[TAG]$2[/TAG]"));