我正在尝试根据提供的字符串使用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 * /。
我想知道我是否在这里想念东西还是朝着不同的方向前进。
我非常感谢您提供的其他帮助或建议来解决此问题。感谢您阅读这篇冗长的帖子!!!
答案 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));
});