找到

时间:2017-07-23 03:35:59

标签: javascript regex

我怎样才能找到之前没有特定字符的所有单词?

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

  

海豚象苹果明星< - 匹配
  狗猫苹果香蕉< - 匹配
  map banana apple dog< - 无与伦比(因为在b之前有一个apple)   地图 apple banana apple cat< - 匹配的第一个apple,但第二个匹配不匹配。
  地图苹果香蕉苹果香蕉苹果< - 只有匹配的第一个apple,其他的都不匹配。
  地图苹果苹果香蕉苹果香蕉苹果< - 第一个apple和第二个apple匹配,其他是无与伦比的。

这是我的尝试:

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

当然,上面的正则表达式是无效的,因为lookbehind内部的量词(在这种情况下为星号)使其成为非固定宽度。那我该怎么做才能解决这个问题呢?

3 个答案:

答案 0 :(得分:1)

已经提到JS regex中没有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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

正则表达口味不同。使用纯正则表达式无法做到的事情可以通过代码得到补偿。

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

在Java中,(?<!b.{0,1000})apple将起作用,因为Java正则表达式引擎支持约束宽度外观模式(在OCPSoftware regex tester测试)。

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

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

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

&#13;
&#13;
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("===================");
}
&#13;
&#13;
&#13;