我正在尝试根据提供的字符串使用RegExp()构造正则表达式。此字符串由请求或生成的动态字符串提供。
我有两个不同的输入
1) "te\*" ->,期望移除'*‘的特殊行为。预期的正则表达式输出应为/te\*/g。
2)使用0个或多个重复字符'e‘的特殊行为的"te*" ->。预期的正则表达式输出应为/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*/。
我想知道我是错过了什么,还是走向了不同的方向。
我感谢任何帮助或建议的替代方法来解决这个问题。感谢你阅读这篇长文!
发布于 2019-05-16 09:35:39
在构建正则表达式之前,首先检查字符串是什么,这样您就会注意到\*是如何在进入正则表达式之前很久就变成单个*的,这是因为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));
});
https://stackoverflow.com/questions/56158965
复制相似问题