使用regExp和replacer函数替换Javascript字符串

时间:2016-02-25 11:09:04

标签: javascript regex

如何在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));

2 个答案:

答案 0 :(得分:3)

更新更通用的解决方案

&#13;
&#13;
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;
&#13;
&#13;

代码说明

您必须先获得用户输入(在dem,key1key2中)。然后,您需要转义它们(请参阅RegExp.escape)以在正则表达式中使用并动态构建正则表达式(请参阅如何构建patt)。然后,遍历输入字符串,检查每个输入字符串是否包含key1key2 indexOf方法,如果是,则执行替换。

仅限数字输入的原始答案

要将13与必须包含1然后3的一系列连续数字匹配,请使用

/\b(?=[0-24-9]*3)(?=[02-9]*1)\d+\b/g

然后将所有13替换为[1],将[3]替换为.replace(/([13])/g, '[$1]'

&#13;
&#13;
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;
&#13;
&#13;

正则表达式解释

  • \b - 前导词边界(这样只允许匹配整个单词,并且只能执行以下前瞻检查一次)
  • (?=[0-24-9]*3) - 如果除了3后跟3之外没有零或更多数字,那么匹配将失败的正向前瞻(因此,3必须在里面更大的数字)
  • (?=[02-9]*1) - 如果除了1后跟1之外没有零或更多数字,那么匹配将失败的正向前瞻(因此,1必须在里面更大的数字)
  • \d+ - 一个或多个数字(匹配它们,以返回结果)
  • \b - 尾随字边界

答案 1 :(得分:0)

我相信/.*(?=1).*(?=3).*/会完成您想要的大部分内容,但它并不能解释编号错误的字符串。区别在于.*在括号之外。

&#13;
&#13;
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;
&#13;
&#13;