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

2019-08-22 01:40:38 +08:00
 mskf

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

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

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

4936 次点击
所在节点    正则表达式
11 条回复
binux
2019-08-22 01:42:45 +08:00
/[^sb]/
muzhidianzi
2019-08-22 01:49:09 +08:00
第一眼看见以为一楼在骂人
gstqc
2019-08-22 02:16:42 +08:00
@binux #1 这个包括了大写字母数字符号等等
gIrl1990
2019-08-22 02:27:20 +08:00
除了 s 和 b 以外所有的小写字母: /[a-z]&&[^sb]/
geelaw
2019-08-22 03:14:48 +08:00
实用正则表达式库里若带有零宽断言则很好写。计算理论意义下的正则表达式则没有什么明显的简便写法。
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
2019-08-22 06:43:30 +08:00
貌似没有楼主想要的 mark 一下
mskf
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
2019-08-22 10:39:43 +08:00
@weakish 嗯,需要语言支持,Java 支持。
weakish
2019-08-22 21:25:49 +08:00
@mskf  反向就是回过头去匹配,像 `[a-z](?<!x)` 匹配的话就是先匹配当前字母是不是 `[a-z]`,匹配到了那当前的「光标」位置就是在当前字母后面(或者说当前字母和下一个字符之间),然后退回去匹配当前字母不是 x

@gIrl1990 谢谢
gIrl1990
2019-08-22 21:37:01 +08:00
@weakish 哦,写太快写错了,应该是
除了 s 和 b 以外所有的小写字母: /[a-z&&[^sb]]/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/594035

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX