2

我有这个正则表达式/\b\d\b/,可以简单地匹配一个数字单词。

现在我想添加下划线字符作为单词边界的替代,所以我也想匹配数字"_1_",同时保持下划线为零长度匹配(如 \b,所以我不想要比赛中的_)。

我的情况是使用捕获组并不理想。

我尝试了一些积极的向前/向后的技巧,向前看似乎有效,而向后看却没有。尝试做可选的向前/向后看,并做类似的事情_|\b,但我找不到一个理想的解决方案。

由于对高级正则表达式技巧不是很了解,我想在使用 2 个正则表达式之前先问一下 :)

这将在 JavaScript 中执行。

4

2 回答 2

2

(?<=\b|_)\d(?=\b|_)

(?<=    # Positive look-behind
\b      # Word boundary
|       # Or
_       # Underscore
)       # End group
\d      # Digit
(?=     # Positive look-ahead
\b|_)   # Word boundary or underscore

它将匹配您的单个数字,并将使用单词边界 ( \b) 或下划线 ( _) 进行匹配。

这是零长度,因此它不会将匹配的数字分组。

在这里玩正则表达式

于 2012-07-03T16:50:43.917 回答
1

由于后视在 JS 中不起作用,您可以只匹配您的主要正则表达式,在您的情况下\d,然后手动检查边界。

const manualBoundaries = /\d/g
const matches = [];
while ((match = manualBoundaries.exec(str)) !== null) {
  const m = match[0]
  const i = match.index
  if ((i == 0 || str[i - 1].match(/(\W|_)/)) &&
      (i + m.length == str.length || str[i + m.length].match(/(\W|_)/)))
    matches.push(m)
}

或者更简洁地说,用假替换

const matches = [];
str.replace(manualBoundaries, (m, i) => {
    if ((i == 0 || str[i - 1].match(/(\W|_)/)) &&
        (i + m.length == str.length || str[i + m.length].match(/(\W|_)/)))
      matches.push(m);
});

在这里试试:https ://jsfiddle.net/djjeck/mg2gzpf1/

于 2016-10-28T19:36:54.603 回答