正则大佬进来看看,被正则折磨死了,如何匹配除了某个关键词的所有字符?

2017-08-20 13:21:54 +08:00
 ioc
比如关键字为 abc,那么:

* 不匹配:
* abc
* 会匹配:
* 若干字符+abc,例如:zzxx123abc
* abc+若干字符,例如:abczzxx123
* 若干字符+abc+若干字符,例如:abczzxx123abczzxx
* 任意字符,例如:asdaexx111fzcsd,123aaaa1223

也就是说除了 abc 不匹配外,其他 **任何** 字符串都是完全匹配。

昨天看了一晚上正则,只试出来了这个最接近目标 `(?!abc).*`,但是不完美。

这个目标能够实现吗?
1665 次点击
所在节点    问与答
9 条回复
ioc
2017-08-20 13:43:04 +08:00
我记得我是用 Markdown 编辑的啊。。
code42
2017-08-20 15:18:00 +08:00
能!但是不优雅:
'[^a].*|a[^b].*|ab[^c].*|abc.+'


PS:
前几天遇到类似问题(将不符合某个模式的行挑出来),没能想出来好用的正则,就换种思路了。
如下:(也不想为这点小事写个 python 脚本什么的,只希望快速搞定,一行命令行那是最好的:)
➜ ~ cat data.txt
abc
zzxx123abc
abczzxx123
abczzxx123abczzxx
asdaexx111fzcsd
123aaaa1223

➜ ~ awk '!/^abc$/ { print $0 }' data.txt
zzxx123abc
abczzxx123
abczzxx123abczzxx
asdaexx111fzcsd
123aaaa1223

如果你的需求和我类似,完全可以使用这种方式。
fox0001
2017-08-20 15:55:34 +08:00
天啊,直接判断不等于字符串“ abc ”就可以了吧?
ioc
2017-08-20 16:17:49 +08:00
@code42 awk 倒是能够直接取反,可这恶心的正则就没直接点的取反语法。模式串一长就尴尬了,只能凑合用了,感谢。
@fox0001 SpringMVC 的 @RequestMapping 路径匹配,不能直接获取的。
ioc
2017-08-20 19:44:09 +08:00
@code42 测试中发现,不能匹配到 a 和 ab,请问如何解决?
code42
2017-08-20 20:17:40 +08:00
@ioc 果不其然(不优雅的解,总是可能潜伏着 bug )
'(?:^(?:a|ab)$)|[^a].*|a[^b].*|ab[^c].*|abc.+'
walleL
2017-08-20 20:59:43 +08:00
另外配一个路径只匹配 abc
行吗?
br00k
2017-08-20 21:01:37 +08:00
没太看明白。。😄试试这个^((?!abc)|abc).+$
code42
2017-08-20 22:37:52 +08:00
@br00k 这大概是最优雅的解了

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

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

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

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

© 2021 V2EX