问题描述:
[^abc]表示不包含a、b、c中任意字符, 我想实现不包含字符串abc应该如何写表达式?
解决方法:
使用编程语言的配合,找出那些包含abc的,剩下的就是不包含的了——懒人的风格。
完全通过正则表达式来完成。
于是打开了RegexTester,开始试验,先是试了使用((?'test'abc)|.)*(?(test)(?!))(含意是:查找abc,或任意的字符,如果找到了abc,就把它存入命名为test的组里,到最后检查test组里是否有内容,如果有就匹配失败,相关说明见教程),结果是"abc","aabc","abcd","aa"都能通过测试,看来是到最后测试到test组存在后又回溯了,此解决方案不可行。
然后又试了(.(?!abc))*(找出所有后面不是abc的字符),结果是"abc","abcd"通过测试,"aabc"则只截取了后面的"abc",显然不行。
那加强条件试试:((?<!abc).(?!abc))*(找出所有前面和后面都不是abc的字符),结果是所有包含abc的字符串都只截取了里面的"abc",不包含abc的则直接通过。
不过,怎么把那些内部包含abc的字符串过滤掉呢?即怎么匹配整体而不是部分呢?
再次明确用户的需求:如果用户想要找的是单词,那就在表达式的两端加上b,如果要找的是行,就加上^和$。
由于用户的问题没有明确说明,我就当作是单词吧。
表达式:
经过测试,这个表达式能匹配所有不包含abc的单词,以及单词abc。
怎么排除单词abc?经过一番思考,最后我认为判断单词是否以a开头的方式最为方便:
(要么以后面不是bc的a开头,要么不以a开头,除了开头后面所有的字符必须前面和后面都不是abc)。
经过测试,完全满足要求,Bingo!
使用正则表达式查找不包含连续字符串abc的单词,最终结果:
最后,更简洁的写法为: