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

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

  •  
  •   cco Aug 31, 2020 3840 views
    This topic created in 2086 days ago, the information mentioned may be changed or developed.
    {"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 replies    2020-09-01 10:23:22 +08:00
    SakuraSa
        1
    SakuraSa  
       Aug 31, 2020
    输入 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  
       Aug 31, 2020
    js 处理不了这个问题,因为 js 规定\是一个转义字符,引擎在处理字符串的时候马上就会处理它。
    而你后面的正则替换是引擎处理字符串之后的事情了,此时字符串里面其实是没有\了,所以要从报文的来源处理:
    1. 如果是自己编写的代码,就手动加上"\\"
    2. 如果是后端的返回,要求后端转义后再给你
    imn1
        3
    imn1  
       Aug 31, 2020
    不太了解 js (应该说忘得差不多了)
    但如果正则串是收到的,没必要自己定义啊,直接调用就行了(把报文按 json 解自然就到变量了)
    关键是解 json 这个过程有没有自动转义的标准,有的话,先处理报文,再解 json,没有的话可以直接调用了
    wxsm
        4
    wxsm  
       Aug 31, 2020
    > String.raw`/d`.replace('/', '//')
    < "//d"
    wxsm
        5
    wxsm  
       Aug 31, 2020
    不好意思,方向搞反了。

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

    @Curtion
    @enjoyCoding
    你们说的是有用的。
    anUglyDog
        9
    anUglyDog  
       Aug 31, 2020
    当前上下文,感觉是无解的,有的话请 @我。。
    anUglyDog
        10
    anUglyDog  
       Aug 31, 2020
    如果传给你的已经是这一串{"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  
       Aug 31, 2020
    你先了解一下字符串内的\号怎么处理再说吧,不然你自己打印一下,本身的字符串输出\号都已经被转义不见了,你再 replace 有啥意义?
    cco
        12
    cco  
    OP
       Sep 1, 2020
    @SakuraSa 多谢大佬,昨天在忙没顾上回复,如果是这样写确实没毛病,但是我的正则表达式是别人传给我的,所以还是得处理转移的问题。
    cco
        13
    cco  
    OP
       Sep 1, 2020
    @Curtion
    @imn1
    @wxsm
    @enjoyCoding
    @GoNtte
    @anUglyDog
    @lovecy
    感谢各位大佬,JS 的确无法处理`\`,不管替换多少个都不好使,最终解决方案抛给了提供方,让他们处理好以后再给我,这样我就可以直接使用了。
    lovecy
        14
    lovecy  
       Sep 1, 2020
    我实测下面这段代码可以跑
    ```
    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"
    About     Help     Advertise     Blog     API     FAQ     Solana     2761 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 14:42 PVG 22:42 LAX 07:42 JFK 10:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86