V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mskf
V2EX  ›  正则表达式

正则表达式中,怎么表达“除了 x 以外的字母”

  •  1
     
  •   mskf · 2019-08-22 01:40:38 +08:00 · 5157 次点击
    这是一个创建于 1950 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说替换除了 s 和 b 以外所有的小写字母,用什么正则表达式

    尽量简单一点,虽然 /[ac-rt-z]/ 可以,但是显然不够直观而且太长了

    我主要是想知道表示"除...以外的..."有没有通用一点的形式

    11 条回复    2019-08-22 21:37:01 +08:00
    binux
        1
    binux  
       2019-08-22 01:42:45 +08:00
    /[^sb]/
    muzhidianzi
        2
    muzhidianzi  
       2019-08-22 01:49:09 +08:00 via Android
    第一眼看见以为一楼在骂人
    0ZXYDDu796nVCFxq
        3
    0ZXYDDu796nVCFxq  
       2019-08-22 02:16:42 +08:00 via Android
    @binux #1 这个包括了大写字母数字符号等等
    gIrl1990
        4
    gIrl1990  
       2019-08-22 02:27:20 +08:00
    除了 s 和 b 以外所有的小写字母: /[a-z]&&[^sb]/
    geelaw
        5
    geelaw  
       2019-08-22 03:14:48 +08:00 via iPhone   ❤️ 1
    实用正则表达式库里若带有零宽断言则很好写。计算理论意义下的正则表达式则没有什么明显的简便写法。
    weakish
        6
    weakish  
       2019-08-22 06:32:39 +08:00
    其实单就这个问题而言,楼主瞧不上的 `[a-wyz]` 既直观又短,`[a-z](?<!x)` (楼上 @geelaw 提到的零宽断言)反而要长一点。

    @gIrl1990 `&&` 什么正则表达式库或者编程语言支持这个特性?我只知道有一个 haskell 的正则表达式库 (github/cacay/regexp) 可以支持正则表达式的交集,还有一个 python 库可以计算正则表达式的交集 (github/qntm/greenery)
    weixiangzhe
        7
    weixiangzhe  
       2019-08-22 06:43:30 +08:00 via iPhone
    貌似没有楼主想要的 mark 一下
    mskf
        8
    mskf  
    OP
       2019-08-22 08:40:13 +08:00
    @weakish 哈哈,这有啥好瞧不起的。。。我其实只是举个例子,比如说除了 aeiou 的所有字母,那样就算表达式不长,写起来也要对着字母表看好久

    @geelaw 零宽断言我理解就是正向 /反向匹配预查,但这样只能对匹配到的串的前后进行筛选,没法对匹配到的串本身进行筛选

    @weixiangzhe 我比较熟悉 js,给出一个临时方案,希望有比较通用的方案
    'asdsasassdbb'.replace(/[a-z]/g,(m,a)=>m.replace(/[s|b]/,''))
    gIrl1990
        9
    gIrl1990  
       2019-08-22 10:39:43 +08:00   ❤️ 1
    @weakish 嗯,需要语言支持,Java 支持。
    weakish
        10
    weakish  
       2019-08-22 21:25:49 +08:00   ❤️ 1
    @mskf  反向就是回过头去匹配,像 `[a-z](?<!x)` 匹配的话就是先匹配当前字母是不是 `[a-z]`,匹配到了那当前的「光标」位置就是在当前字母后面(或者说当前字母和下一个字符之间),然后退回去匹配当前字母不是 x

    @gIrl1990 谢谢
    gIrl1990
        11
    gIrl1990  
       2019-08-22 21:37:01 +08:00
    @weakish 哦,写太快写错了,应该是
    除了 s 和 b 以外所有的小写字母: /[a-z&&[^sb]]/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   882 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:55 · PVG 05:55 · LAX 13:55 · JFK 16:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.