“逆序回溯”的方法似乎是最简单的。对于像这样的短数字模式,这种方法效果最佳。”
function revStr(str) {
return str.split('').reverse().join('');
}
var s = "--1--01001--1087---";
var rxp = /\d(?=[01])/g;
var result = revStr(revStr(s).replace(rxp, "#"));
document.write(result);
逻辑:
\d(?=[01])
是反向正则表达式 (?<=[01])\d
- 我们使用
revStr(s)
函数翻转输入字符串
- 再次翻转替换结果以获取最终结果。
注意:
如果您需要在 JavaScript 中同时使用可变宽度的后向查找和前向查找,我可以推荐阅读 Steven Levithan 的 JavaScript Regex Lookbehind Redux 文章,在其中您可以找到一个示例函数,显示如何使用 XRegExp 实现该行为。以下是这些函数:
(function (XRegExp) {
function prepareLb(lb) {
var parts = /^((?:\(\?[\w$]+\))?)\(\?<([=!])([\s\S]*)\)$/.exec(lb);
return {
lb: XRegExp(parts ? parts[1] + "(?:" + parts[3] + ")$(?!\\s)" : lb),
type: parts ? parts[2] === "=" : !parts
};
}
XRegExp.execLb = function (str, lb, regex) {
var pos = 0, match, leftContext;
lb = prepareLb(lb);
while (match = XRegExp.exec(str, regex, pos)) {
leftContext = str.slice(0, match.index);
if (lb.type === lb.lb.test(leftContext)) {
return match;
}
pos = match.index + 1;
}
return null;
};
XRegExp.testLb = function (str, lb, regex) {
return !!XRegExp.execLb(str, lb, regex);
};
XRegExp.searchLb = function (str, lb, regex) {
var match = XRegExp.execLb(str, lb, regex);
return match ? match.index : -1;
};
XRegExp.matchAllLb = function (str, lb, regex) {
var matches = [], pos = 0, match, leftContext;
lb = prepareLb(lb);
while (match = XRegExp.exec(str, regex, pos)) {
leftContext = str.slice(0, match.index);
if (lb.type === lb.lb.test(leftContext)) {
matches.push(match[0]);
pos = match.index + (match[0].length || 1);
} else {
pos = match.index + 1;
}
}
return matches;
};
XRegExp.replaceLb = function (str, lb, regex, replacement) {
var output = "", pos = 0, lastEnd = 0, match, leftContext;
lb = prepareLb(lb);
while (match = XRegExp.exec(str, regex, pos)) {
leftContext = str.slice(0, match.index);
if (lb.type === lb.lb.test(leftContext)) {
output += str.slice(lastEnd, match.index) + XRegExp.replace(match[0], regex, replacement);
lastEnd = match.index + match[0].length;
if (!regex.global) {
break;
}
pos = match.index + (match[0].length || 1);
} else {
pos = match.index + 1;
}
}
return output + str.slice(lastEnd);
};
}(XRegExp));
每个函数都需要三个参数:要搜索的字符串,作为字符串的回顾模式(可以使用XRegExp语法扩展),以及主正则表达式。
XRegExp.replaceLb
需要第四个参数作为替换值,可以是字符串或函数。
以下是使用示例:
XRegExp.execLb("Fluffy cat", "(?i)(?<=fluffy\\W+)", XRegExp("(?i)(?<first>c)at"));
XRegExp.execLb("Fluffy cat", "(?i)(?<!fluffy\\W+)", /cat/i);
XRegExp.testLb("Fluffy cat", "(?i)(?<=fluffy\\W+)", /cat/i);
XRegExp.testLb("Fluffy cat", "(?i)(?<!fluffy\\W+)", /cat/i);
XRegExp.searchLb("Catwoman's fluffy cat", "(?i)(?<=fluffy\\W+)", /cat/i);
XRegExp.searchLb("Catwoman's fluffy cat", "(?i)(?<!fluffy\\W+)", /cat/i);
XRegExp.matchAllLb("Catwoman's cats are fluffy cats", "(?i)(?<=fluffy\\W+)", /cat\w*/i);
XRegExp.matchAllLb("Catwoman's cats are fluffy cats", "(?i)(?<!fluffy\\W+)", /cat\w*/i);
XRegExp.replaceLb("Catwoman's fluffy cat is a cat", "(?i)(?<=fluffy\\W+)", /cat/ig, "dog");
XRegExp.replaceLb("Catwoman's fluffy cat is a cat", "(?i)(?<!fluffy\\W+)", /cat/ig, "dog");
XRegExp.replaceLb("Catwoman's fluffy cat is a cat", "(?i)(?<!fluffy\\W+)", /cat/ig, function ($0) {
var first = $0.charAt(0);
return first === first.toUpperCase() ? "Dog" : "dog";
});