我怎样才能找到之前没有特定字符的所有单词?
例如,如果我想匹配之前没有任何字符apple
的所有b
,我该怎么办?
海豚象苹果明星< - 匹配
狗猫苹果香蕉< - 匹配
map banana apple dog< - 无与伦比(因为在b
之前有一个apple
) 地图 apple banana apple cat< - 匹配的第一个apple
,但第二个匹配不匹配。
地图苹果香蕉苹果香蕉苹果< - 只有匹配的第一个apple
,其他的都不匹配。
地图苹果狗苹果香蕉苹果香蕉苹果< - 第一个apple
和第二个apple
匹配,其他是无与伦比的。
这是我的尝试:
/(?<!.*b.*)apple/g
当然,上面的正则表达式是无效的,因为lookbehind内部的量词(在这种情况下为星号)使其成为非固定宽度。那我该怎么做才能解决这个问题呢?
答案 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):
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;