【问题标题】: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 匹配,其他不匹配。
地图 apple 狗 apple 香蕉 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
        相关资源
        最近更新 更多