前端小白,问个关于正则表达式转义的问题

2020-08-31 14:01:45 +08:00
 cco
{"reg":"^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"}

现在收到这么一个报文,需要将其转换为正则表达式:

let e1 = /^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/
"192.168.1.1".match(e1)

但是,现在遇到问题了。如果直接使用 new RegExp(),那么需要将 reg 的 value 中/d替换为//d才可以,实际上我做了替换以后还是行不通。

var r2 = new RegExp('^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$'.replace("\\","\\\\"));
undefined
"192.168.1.1".match(r2)
null

有木有大佬帮忙给个思路。谢谢,Google 前三页已经都看过了,没有尝试成功的解决方案。

2765 次点击
所在节点    JavaScript
14 条回复
SakuraSa
2020-08-31 14:30:57 +08:00
输入 js 的 string 的时候,也要注意转义的问题
```js
var d = String.raw`^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$`;
var r2 = new RegExp(d);
"192.168.1.1".match(r2);
```
ps. 如果 json 中的数据是按照你现在写的形式,应该不需要做转义处理的。
Curtion
2020-08-31 15:24:49 +08:00
js 处理不了这个问题,因为 js 规定\是一个转义字符,引擎在处理字符串的时候马上就会处理它。
而你后面的正则替换是引擎处理字符串之后的事情了,此时字符串里面其实是没有\了,所以要从报文的来源处理:
1. 如果是自己编写的代码,就手动加上"\\"
2. 如果是后端的返回,要求后端转义后再给你
imn1
2020-08-31 15:45:22 +08:00
不太了解 js (应该说忘得差不多了)
但如果正则串是收到的,没必要自己定义啊,直接调用就行了(把报文按 json 解自然就到变量了)
关键是解 json 这个过程有没有自动转义的标准,有的话,先处理报文,再解 json,没有的话可以直接调用了
wxsm
2020-08-31 15:52:27 +08:00
> String.raw`/d`.replace('/', '//')
< "//d"
wxsm
2020-08-31 15:57:37 +08:00
不好意思,方向搞反了。

> String.raw`\d`.replace('\\', '\\\\')
< "\\d"
enjoyCoding
2020-08-31 16:04:14 +08:00
这个字符串是哪里来的 能不能从后端出发解决这个事情 比如他给你传\\d 这种
如果是用户输入的 能不能在用户输入后前端把\d 转成\\d 再入库?
GoNtte
2020-08-31 16:55:57 +08:00
试试先把字符串中的 \ 转为 \\,然后再 new RegExp
anUglyDog
2020-08-31 19:04:15 +08:00
@GoNtte
@wxsm
@imn1
@SakuraSa
回答问题也要认真看题,测试一下,不要浪费提问题的人的时间好吗?

@Curtion
@enjoyCoding
你们说的是有用的。
anUglyDog
2020-08-31 19:08:57 +08:00
当前上下文,感觉是无解的,有的话请 @我。。
anUglyDog
2020-08-31 19:12:07 +08:00
如果传给你的已经是这一串{"reg":"^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"},那他里面的\虽然显示\,其实已经是\\才对。就像在 input 里输入\,js 获取到的其实是\\,只是会显示\。
lovecy
2020-08-31 19:22:19 +08:00
你先了解一下字符串内的\号怎么处理再说吧,不然你自己打印一下,本身的字符串输出\号都已经被转义不见了,你再 replace 有啥意义?
cco
2020-09-01 08:52:22 +08:00
@SakuraSa 多谢大佬,昨天在忙没顾上回复,如果是这样写确实没毛病,但是我的正则表达式是别人传给我的,所以还是得处理转移的问题。
cco
2020-09-01 08:54:34 +08:00
@Curtion
@imn1
@wxsm
@enjoyCoding
@GoNtte
@anUglyDog
@lovecy
感谢各位大佬,JS 的确无法处理`\`,不管替换多少个都不好使,最终解决方案抛给了提供方,让他们处理好以后再给我,这样我就可以直接使用了。
lovecy
2020-09-01 10:23:22 +08:00
我实测下面这段代码可以跑
```
fetch("?ajax=1").then(res=>res.text()).then(res=>{

console.log(res);
res = res.replaceAll("\\","\\\\");
console.log(res);
let reg = new RegExp(JSON.parse(res).reg);
let matches = "192.168.1.1".match(reg);
console.log(reg, matches);

});
```
控制台打印结果如下
{"reg":"^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"} //第三行
{"reg":"^((2[0-4]\\d|25[0-5]|[1-9]?\\d|1\\d{2})\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$"} //第五行
/^((2[0-4]\d|25[0-5]|[1-9]?\d|1\d{2})\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/ //第八
0: "192.168.1.1" // 第八
1: "1."
2: "1"
3: "1"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702806

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX