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

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

  •  1
     
  •   mskf · 115 天前 · 2341 次点击
    这是一个创建于 115 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    @gIrl1990 谢谢
        11
    gIrl1990   114 天前
    @weakish 哦,写太快写错了,应该是
    除了 s 和 b 以外所有的小写字母: /[a-z&&[^sb]]/
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   970 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 19:51 · PVG 03:51 · LAX 11:51 · JFK 14:51
    ♥ Do have faith in what you're doing.