你在这里真正想做的是为一种小语言编写一个解析器。正则表达式擅长某些解析任务,但在许多任务上表现不佳(而且 JS 正则表达式的功能有些不足)。您可能能够找到在特定情况下工作的正则表达式,然后当您的语法规则发生变化时,正则表达式可能难以或不可能更改以反映这一点。下面这个简单的程序具有可读性和可维护性的优点。它完全按照它所说的去做。
function find_bs(str) {
var indexes = [];
for (var i = 0; i < str.length; i++) {
if (str[i] === 'b' && str[i-1] !== 'a' && str[i+1] !== 'a')
indexes.push(i);
}
return indexes;
}
使用正则表达式
如果您绝对坚持使用正则表达式,则可以lastIndex
结合使用重置正则表达式属性的技巧RegExp.exec
:
function find_bs(str) {
var indexes = [];
var regexp = /.b[^a]|[^a]b./g;
var matches;
while (matches = regexp.exec(str)) {
indexes.push(matches.index + 1);
regexp.lastIndex -= 2;
}
return indexes;
}
您将需要调整逻辑来处理字符串的开头和结尾。
这是如何工作的
xbx
我们使用正则表达式找到整个字符串。的索引b
将是匹配索引的一加,所以我们记录下来。在我们进行下一次匹配之前,我们将lastIndex
控制搜索将继续的起点,重置回b
,因此它作为任何后续潜在匹配的第一个字符。