【问题标题】:JavaScript RegEx, zero-length match with OR (look ahead and behind, maybe)JavaScript RegEx,与 OR 的零长度匹配(向前和向后看,也许)
【发布时间】:2012-07-04 03:42:36
【问题描述】:

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

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

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

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

对高级 RegEx 技巧不是很了解,我想在使用 2 个 RegEx 之前先问一下 :)

这将在 JavaScript 中执行。

【问题讨论】:

    标签: regex lookaround


    【解决方案1】:

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

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

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

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

    Play with the regex here.

    【讨论】:

    • 这仍然会在匹配结果中包含下划线。我希望下划线是零长度的可选匹配
    • @SamerAbukhait 没错,我已经对其进行了编辑,使其不包含下划线。
    • 那是我实际尝试过的正则表达式,但我得到了无效的正则表达式错误。我在 Chrome、Node 甚至 Ruby 1.9 中进行了尝试。它的前瞻部分有效,但后瞻部分不起作用
    • @SamerAbukhait 是的,做了一些研究,看起来 JS 不支持后视。我会做一些研究,看看是否可以模仿。
    • 您能否编辑答案并写下它尚未准备好使用。来自v8project.blogspot.de/2016/02/regexp-lookbehind-assertions.htmlYou can already experiment with lookbehind assertions by running V8 version 4.9 or later with --harmony, or by enabling experimental JavaScript features (use about:flags) in Chrome from version 49 onwards.
    【解决方案2】:

    由于后视在 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-13
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多