V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
cco
V2EX  ›  JavaScript

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

  •  
  •   cco · 2020-08-31 14:01:45 +08:00 · 1803 次点击
    这是一个创建于 454 天前的主题,其中的信息可能已经有所发展或是发生改变。
    {"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 前三页已经都看过了,没有尝试成功的解决方案。

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

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

    @Curtion
    @enjoyCoding
    你们说的是有用的。
    anUglyDog
        9
    anUglyDog   2020-08-31 19:08:57 +08:00
    当前上下文,感觉是无解的,有的话请 @我。。
    anUglyDog
        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 获取到的其实是\\,只是会显示\。
    lovecy
        11
    lovecy   2020-08-31 19:22:19 +08:00
    你先了解一下字符串内的\号怎么处理再说吧,不然你自己打印一下,本身的字符串输出\号都已经被转义不见了,你再 replace 有啥意义?
    cco
        12
    cco   2020-09-01 08:52:22 +08:00
    @SakuraSa 多谢大佬,昨天在忙没顾上回复,如果是这样写确实没毛病,但是我的正则表达式是别人传给我的,所以还是得处理转移的问题。
    cco
        13
    cco   2020-09-01 08:54:34 +08:00
    @Curtion
    @imn1
    @wxsm
    @enjoyCoding
    @GoNtte
    @anUglyDog
    @lovecy
    感谢各位大佬,JS 的确无法处理`\`,不管替换多少个都不好使,最终解决方案抛给了提供方,让他们处理好以后再给我,这样我就可以直接使用了。
    lovecy
        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"
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1021 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:03 · PVG 03:03 · LAX 11:03 · JFK 14:03
    ♥ Do have faith in what you're doing.