为什么此正则表达式的输出会变化?

时间:2019-05-15 23:40:11

标签: javascript regex escaping unescapestring

我正在尝试根据提供的字符串使用RegExp()构造正则表达式。该字符串由请求提供,也可以由动态生成。

我有两个不同的输入

1)“ te \ *” ->希望删除“ *”的特殊行为。预期的正则表达式输出应为/ te \ * / g。

2)“ te *” ->使用0或更多重复字符'e'的特殊行为。预期的正则表达式输出应为/ te * / g。

new RegExp("te\*") -> /te*/
new RegExp("te*") -> /te*/

我的第一个问题是,为什么两个输入的结果都相同?我想可能是因为逃跑。然后我尝试了

new RegExp("te\\*") -> /te\*/

我在浏览doc后添加了转义。

var escapeString = function (string){
 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
} 

使用转义功能最终得到与不同结果相同的结果。

escapeString("te\*") -> /te\\*/
escapeString("te*") -> /te\\*/

我尝试通过将两个反斜杠都不替换来进行转义。我不太确定这种转义是否正确。

var unescapeString = function(string){
 return string.replace(/\\\\/g,"");
}

我想知道为什么正则表达式的结果没有改变。我不知道该如何改变这些输入?

出于这种行为,我决定尝试进行转义之类的一些操作,或者是否进行转义输入工作。

1)首先输入“ te \ *”

var unescapeString = function(string){
 return string.replace(/\\\\/g,"");
}

var escapeString = function (string){
 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

var aa = "te\*";

var a1_es = escapeString(aa);
aa_arr = [];
aa_arr.push(a1_es);
console.log("es1 => ", aa_arr);

var aa_es = escapeString(aa_arr[0]);
aa2_arr = [];
aa2_arr.push(aa_es);
console.log("es2 => ", aa2_arr);

var aa_ues = unescapeString(aa2_arr[0]);
aa_uesArr = [];
aa_uesArr.push(aa_ues);
console.log("ues ===>", aa_uesArr);

var rgex = new RegExp(aa_uesArr[0]);

console.log("rgex2 ===> ",rgex )

以上代码段的输出:

es1 =>  [ 'te\\*' ]
es2 =>  [ 'te\\\\\\*' ]
ues ===> [ 'te\\*' ]
rgex2 ===>  /te\*/

我对“首次输入”的预期输出很好。

2)第二个输入“ te *”

var actual = "te*";

var unescapeString = function(string){
 return string.replace(/\\\\/g,"");
}

var escapeString = function (string){
 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

var actual_es1 = escapeString(actual);
actual1_arr = [];
actual1_arr.push(actual_es1);
console.log("es1 => ", actual1_arr);


var actual_es = escapeString(actual1_arr[0]);
actual_arr = [];
actual_arr.push(actual_es);
console.log("es2 => ", actual_arr);


var actual_ues = unescapeString(actual_es);
actual_uesArr = [];
actual_uesArr.push(actual_ues);
console.log("ues ===>", actual_uesArr);

var actualrgex = new RegExp(actual_uesArr[0]);
console.log("actualrgex ===> ",actualrgex );

以上代码段的输出

es1 =>  [ 'te\\*' ]
es2 =>  [ 'te\\\\\\*' ]
ues ===> [ 'te\\*' ]
actualrgex ===>  /te\*/

第二个输入变化的预期输出。它应该是/ te * /。

我想知道我是否在这里想念东西还是朝着不同的方向前进。

我非常感谢您提供的其他帮助或建议来解决此问题。感谢您阅读这篇冗长的帖子!!!

1 个答案:

答案 0 :(得分:0)

首先检查字符串是什么,然后再构建正则表达式 因此您在进入正则表达式之前很久就注意到\*如何成为一个* 那是因为JavaScript字符串中的反斜杠\行为

var arr = ['te\*', 'te*', 'te\\*'];
arr.forEach(function(s) {
  console.log('s => ', s);
});

以防万一您想在代码段中看到它的作用:

var escapeString = function (string){
 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

var arr = ['te\*', 'te*', 'te\\*'];
arr.forEach(function(s) {
  console.log('s => ', s);

  var es1 = escapeString(s);
  console.log('es1 => ', es1);
  console.log('regex1 ===> ', new RegExp(es1));

  var es2 = escapeString(es1);
  console.log('es2 => ', es2);
  console.log('regex2 ===> ', new RegExp(es2));
});