首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个正则表达式的输出会发生变化?

为什么这个正则表达式的输出会发生变化?
EN

Stack Overflow用户
提问于 2019-05-16 07:40:11
回答 1查看 49关注 0票数 -1

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

我有两个不同的输入

1) "te\*" ->,期望移除'*‘的特殊行为。预期的正则表达式输出应为/te\*/g。

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

代码语言:javascript
复制
new RegExp("te\*") -> /te*/
new RegExp("te*") -> /te*/

我的第一个问题是,为什么两个输入的结果是相同的?我猜可能是因为逃走吧。然后我试着

代码语言:javascript
复制
new RegExp("te\\*") -> /te\*/

在查看了doc之后,我添加了转义。

代码语言:javascript
复制
var escapeString = function (string){
 return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
} 

使用转义函数的结果与不同的结果相同。

代码语言:javascript
复制
escapeString("te\*") -> /te\\*/
escapeString("te*") -> /te\\*/

我试着不转义,把两个黑斜杠都换成一个也没有。我不太确定这种不转义是否正确。

代码语言:javascript
复制
var unescapeString = function(string){
 return string.replace(/\\\\/g,"");
}

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

有了这个行为,我决定尝试一些事情,如转义和做取消转义的输入工作或不。

1)第一个输入"te\*“

代码语言:javascript
复制
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 )

以上代码段的输出:

代码语言:javascript
复制
es1 =>  [ 'te\\*' ]
es2 =>  [ 'te\\\\\\*' ]
ues ===> [ 'te\\*' ]
rgex2 ===>  /te\*/

我对第一个输入的预期输出是好的。

2)第二个输入"te*“

代码语言:javascript
复制
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 );

以上代码段的输出

代码语言:javascript
复制
es1 =>  [ 'te\\*' ]
es2 =>  [ 'te\\\\\\*' ]
ues ===> [ 'te\\*' ]
actualrgex ===>  /te\*/

第二个输入的预期输出会有所不同。它应该是/te*/。

我想知道我是错过了什么,还是走向了不同的方向。

我感谢任何帮助或建议的替代方法来解决这个问题。感谢你阅读这篇长文!

EN

回答 1

Stack Overflow用户

发布于 2019-05-16 09:35:39

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

代码语言:javascript
复制
var arr = ['te\*', 'te*', 'te\\*'];
arr.forEach(function(s) {
  console.log('s => ', s);
});

如果你想在你的代码片段中看到它的实际效果:

代码语言:javascript
复制
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));
});

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56158965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档