如何在regexp和string replacer函数中使用AND运算符。请参阅以下代码示例。在这里,因为我使用的是| (OR)运算符我得到这样的输出
[“我是数字[1]”,“我是数字[1] 2”,“我是数字[1] 2 [3]”,“我是 数字[1] 2 [3] 4“,”我是数字[1] 2 [3] 45“,”我是数字[1] 2 [3] 456“]
所以,而不是OR如何使用AND,以便只包含1&的字符串。 3应该不受其他影响。我尝试过使用
var patt = /(?=。* 1)(?=。* 3)/ g;
它不起作用,虽然如果我做patt.test(“String”)它工作正常。但是,有了替换器功能,它不是。任何人都可以帮忙
var arr = [ "I am number 1",
"I am number 12", "I am number 123", "I am number 1234",
"I am number 12345", "I am number 123456"];
var patt = /1|3/g;
for (var i = 0; i < arr.length; i++) {
arr[i] = arr[i].replace(patt, function(match) {
if (match.length) return '['+match+']';
else return match;
});
};
console.log(arr);
修改 间接的方式是有两种模式
var pattToReplace = / 1 | 3 / g;
var pattToValidate = /(?=。* 1)(?=。* 3)/ g;
var arr = [ "I am number 1",
"I am number 12", "I am number 123", "I am number 1234",
"I am number 12345", "I am number 123456", "I am number 33234156"];
var pattToReplace = /1|3/g;
var pattToValidate = /(?=.*1)(?=.*3)/g;
for (var i = 0; i < arr.length; i++) {
if (pattToValidate.test(arr[i])) {
arr[i] = arr[i].replace(pattToReplace, function(match) {
if (match.length) return '['+match+']';
else return match;
});
}
};
document.write(JSON.stringify(arr, null, 2));
答案 0 :(得分:3)
RegExp.escape = function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
var arr = [ "I am number (a)",
"I am number -c-+b+", "I am number (a)+b+-c-", "I am number (a)+b+-c--d-", "I am number (a)+b+-c--d--e-", "I am number (a)+b+-c--d--e--f-", "I am number -c--c-+b+-c--d-(a)-e--f-"];
var key1 = "(a)";
var key2 = "+b+";
var patt = RegExp("(" + RegExp.escape(key1) + "|" + RegExp.escape(key2) + ")", "g");
for (var i = 0; i < arr.length; i++) {
if (arr[i].indexOf(key1) > -1 && arr[i].indexOf(key2) > -1) {
arr[i] = arr[i].replace(patt, '[$1]');
}
};
document.body.innerHTML = "<pre>" + JSON.stringify(arr, 0, 4) + "</pre>";
&#13;
代码说明:
您必须先获得用户输入(在dem,key1
和key2
中)。然后,您需要转义它们(请参阅RegExp.escape
)以在正则表达式中使用并动态构建正则表达式(请参阅如何构建patt
)。然后,遍历输入字符串,检查每个输入字符串是否包含key1
和key2
indexOf
方法,如果是,则执行替换。
要将1
或3
与必须包含1
然后3
的一系列连续数字匹配,请使用
/\b(?=[0-24-9]*3)(?=[02-9]*1)\d+\b/g
然后将所有1
和3
替换为[1]
,将[3]
替换为.replace(/([13])/g, '[$1]'
:
var arr = [ "I am number 1",
"I am number 12", "I am number 123", "I am number 1234",
"I am number 12345", "I am number 123456", "I am number 33234156"];
var patt = /\b(?=[0-24-9]*3)(?=[02-9]*1)\d+\b/g;
for (var i = 0; i < arr.length; i++) {
arr[i] = arr[i].replace(patt, function(match) {
if (match.length) return match.replace(/([13])/g, '[$1]');
else return match;
});
};
document.body.innerHTML = "<pre>" + JSON.stringify(arr, 0, 4) + "</pre>";
&#13;
正则表达式解释:
\b
- 前导词边界(这样只允许匹配整个单词,并且只能执行以下前瞻检查一次)(?=[0-24-9]*3)
- 如果除了3
后跟3
之外没有零或更多数字,那么匹配将失败的正向前瞻(因此,3
必须在里面更大的数字)(?=[02-9]*1)
- 如果除了1
后跟1
之外没有零或更多数字,那么匹配将失败的正向前瞻(因此,1
必须在里面更大的数字)\d+
- 一个或多个数字(匹配它们,以返回结果)\b
- 尾随字边界答案 1 :(得分:0)
我相信/.*(?=1).*(?=3).*/
会完成您想要的大部分内容,但它并不能解释编号错误的字符串。区别在于.*
在括号之外。
var arr = [
"I am number 1",
"I am number 12",
"I am number 123",
"I am number 1234",
"I am number 12345",
"I am number 123456",
"I am number 54321"
];
var result = "";
var patt = /.*(?=1).*(?=3).*/g;
for (var i = 0; i < arr.length; i++) {
arr[i] = arr[i].replace(patt, function(match) {
if (match.length) result += '['+match+']' + "\n";
});
};
document.getElementById('result').innerHTML = result;
&#13;
html, body, textarea {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
}
&#13;
<html>
<body>
<textarea id="result"></textarea>
</body>
</html>
&#13;