{"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 前三页已经都看过了,没有尝试成功的解决方案。
1
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 中的数据是按照你现在写的形式,应该不需要做转义处理的。 |
2
Curtion 2020-08-31 15:24:49 +08:00
js 处理不了这个问题,因为 js 规定\是一个转义字符,引擎在处理字符串的时候马上就会处理它。
而你后面的正则替换是引擎处理字符串之后的事情了,此时字符串里面其实是没有\了,所以要从报文的来源处理: 1. 如果是自己编写的代码,就手动加上"\\" 2. 如果是后端的返回,要求后端转义后再给你 |
3
imn1 2020-08-31 15:45:22 +08:00
不太了解 js (应该说忘得差不多了)
但如果正则串是收到的,没必要自己定义啊,直接调用就行了(把报文按 json 解自然就到变量了) 关键是解 json 这个过程有没有自动转义的标准,有的话,先处理报文,再解 json,没有的话可以直接调用了 |
4
wxsm 2020-08-31 15:52:27 +08:00
> String.raw`/d`.replace('/', '//')
< "//d" |
5
wxsm 2020-08-31 15:57:37 +08:00
不好意思,方向搞反了。
> String.raw`\d`.replace('\\', '\\\\') < "\\d" |
6
enjoyCoding 2020-08-31 16:04:14 +08:00
这个字符串是哪里来的 能不能从后端出发解决这个事情 比如他给你传\\d 这种
如果是用户输入的 能不能在用户输入后前端把\d 转成\\d 再入库? |
7
GoNtte 2020-08-31 16:55:57 +08:00
试试先把字符串中的 \ 转为 \\,然后再 new RegExp
|
8
anUglyDog 2020-08-31 19:04:15 +08:00
|
9
anUglyDog 2020-08-31 19:08:57 +08:00
当前上下文,感觉是无解的,有的话请 @我。。
|
10
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 获取到的其实是\\,只是会显示\。
|
11
lovecy 2020-08-31 19:22:19 +08:00
你先了解一下字符串内的\号怎么处理再说吧,不然你自己打印一下,本身的字符串输出\号都已经被转义不见了,你再 replace 有啥意义?
|
12
cco OP @SakuraSa 多谢大佬,昨天在忙没顾上回复,如果是这样写确实没毛病,但是我的正则表达式是别人传给我的,所以还是得处理转移的问题。
|
13
cco OP |
14
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" |