【问题标题】:Find all words which have no specific character before查找之前没有特定字符的所有单词
【发布时间】:2017-08-04 03:27:27
【问题描述】:

如何找到之前没有特定字符的所有单词?

例如,如果我想匹配所有apple,它前面没有任何字符b,我该怎么办?

海豚大象苹果星     狗 猫 苹果 香蕉             map banana apple dog          apple 之前有一个b
地图 apple 香蕉 apple cat apple 匹配,但第二个不匹配。
地图 apple 香蕉 apple 香蕉 apple apple 匹配,其他不匹配。
地图 appleapple 香蕉 apple 香蕉 apple apple 和第二个 apple匹配,其他不匹配。

这是我的尝试:

/(?<!.*b.*)apple/g

当然,上面的正则表达式是无效的,因为后面的量词(在这种情况下是星号)使其宽度不固定。那么我该如何解决这个问题呢?

【问题讨论】:

  • /^[^b]*apple/?
  • 哦,我忘了说apple这个词可以匹配多次。
  • 你使用什么编程语言?
  • Javascript。但我希望我只能使用正则表达式来找到那个词。
  • 那么你的第一个问题是JavaScript不支持look-behind,而不是它的可变宽度。

标签: javascript regex


【解决方案1】:

已经提到,在 JS 正则表达式中没有可用的lookbehind。对我来说,这听起来像是您想要匹配并最终替换特定字符之前的匹配单词。

我会在第一次出现时拆分字符串和capture the split sequence。然后仅在第一部分匹配/替换,然后重新加入这些部分。 [^]* 只匹配任何字符。

// Test strings
var strs = ['dolphin elephant apple star','dog cat apple banana','map banana apple dog',
'map apple banana apple cat','map apple banana apple banana apple',
'map apple dog apple banana apple banana apple'];

// Split string at separator - Replace in first part - Rejoin
for (var str of strs) {
  var parts = str.split(/(b[^]*)/);
  parts[0] = parts[0].replace(/\b(apple)\b/g, '<b>$1</b>');
  var new_str = parts.join('');
  
  // Check result
  console.log(new_str);
}

【讨论】:

    【解决方案2】:

    首先,搜索第一次出现的字符。然后将子字符串从 0 带到该索引,并将模式与子字符串匹配。如果找不到该字符,则只需搜索整个字符串。

    【讨论】:

      【解决方案3】:

      正则表达式风格不同。用纯正则表达式做不到的事情通常可以用代码来弥补。

      .NET,Python PyPi 正则表达式引擎支持无限宽度的后视模式,您的方法将在那里工作(见this regex demo)。

      在 Java 中,(?&lt;!b.{0,1000})apple 将作为 Java 正则表达式引擎支持 constrained-width 后视模式(在 OCPSoftware regex tester 测试)。

      在 PHP 中,您可以使用 known (*SKIP)(*FAIL) PCRE verbs 跳过不需要的内容,使用 b.*?apple(*SKIP)(*F)|apple)。

      在 JavaScript 和 Python re 中,使用可选的 capturing 组并检查它是否匹配。如果匹配,则丢弃匹配,否则,抓住它。

      这是一个 JS 实现(见regex demo):

      var ss = ['dolphin elephant apple star','dog cat apple banana','map banana apple dog','map apple banana apple cat','map apple banana apple banana apple','map apple dog apple banana apple banana apple'];
      var rx = /(b.*?)?apple/g;
      for (var s of ss) {
        console.log("Testing '"+s+"'.....");
        var m;
        while(m=rx.exec(s)) {
           if (!m[1]) console.log(m[0]," at ", m.index);
        }
        console.log("===================");
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 2015-09-04
        • 2014-10-27
        • 1970-01-01
        • 2017-02-03
        • 2011-02-22
        • 1970-01-01
        相关资源
        最近更新 更多