`
maimode
  • 浏览: 412068 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正则表达式中不包含连续字符

阅读更多

参考资料:

http://www.cnblogs.com/deerchao/archive/2007/02/15/651411.html

 

就我自己而言,这个问题最简单的解决方法是使用编程语言的配合,找出那些包含abc的,剩下的就是不包含的了——懒人的风格。但我写的是教程,读者未必都有编程的基础,有些只是使用一些工具从txt文档中抽取出一些信息,所以要回答还是必须完全通过正则表达式来完成。

于是打开了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,如果要找的是行,就加上^$。由于用户的问题没有明确说明,我就当作是单词吧。

于是等到了这样的表达式:\b((?<!abc).(?!abc))*\b,经过测试,这个表达式能匹配所有不包含abc的单词,以及单词abc。

怎么排除单词abc?经过一番思考,最后我认为判断单词是否以a开头的方式最为方便:\b(a(?!bc)|[^a](?!abc))((?<!abc).(?!abc))*\b(要么以后面不是bc的a开头,要么不以a开头,除了开头后面所有的字符必须前面和后面都不是abc)。经过测试,完全满足要求,Bingo!

使用正则表达式查找不包含连续字符串abc的单词,最终结果:\b(a(?!bc)|[^a](?!abc))((?<!abc).(?!abc))*\b
----------------
更新:根据maple的评论,更简洁的作法是
:
\b((?!abc)\w)+\b 

分享到:
评论

相关推荐

    正则表达式教程

    正则表达式教程  正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 &lt;br&gt;列目录时, dir *....

    正则表达式

    一个字符类和它所包含的任何一个字符都匹配,所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一个 都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.定义否定...

    java 正则表达式

    JAVA正则表达式语法(转)正则表达式语法正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式 ...

    正则表达式 正则表达式

    断是否有6个连续数字的字符串 \d{6} 搜素包含cat的字符串 cat 找出三个字母的单词,而且这些单词必须以“t”字母开头,...一段字符串中不能出现dog这个联系的三个字符组成的单词.. \w*(dog){0}\w* 等..............

    正则表达式30分钟入门教程

    正则表达式里还有更多的元字符,比如\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。\w匹配字母或数字或下划线或汉字等。 对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的,其它...

    javascript学习笔记(八)正则表达式

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 首先推荐几个正则表达式编辑器  Debuggex :...

    一个验证用户名的正则表达式

    VBscript编程要求用户名的字符控制在3至20个之间,由中文、大小写字母、数字、下划线、小数点、减号组成, 必须以中英文或数字开头结尾且下划线、小数点、减号这三个字符中的其中一个的组合不能是连续的 a__a或a–...

    PHP匹配连续的数字或字母的正则表达式

    正则表达式的写法规则:“/规则需要写在2个斜杠中间/”。 (. :小数点)用于匹配除换行符之外的所有字符。 (\s:反斜杠小写s)用于匹配单个空格符,包括tab键和换行符; (\S:反斜杠大写S)用于匹配除单个空格符...

    学习php中的正则表达式

     上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。  在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用...

    正则表达式1

    /fo+/因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字

    php中邮箱地址正则表达式实现与详解

    首先附上代码 复制代码 代码如下: ^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$ 在这段正则表达式中,“+”表示前面的字符串连续出现一个或多个;“^”表示下一个字符串必须出现在开头,“$”表示前一个字符串...

    Generex:Generex是一个灵活的正则表达式引擎,用于对象的任意集合,而不仅仅是由字符组成的字符串。 与典型的正则表达式相比,它具有更多的类型安全性和丰富的功能

    完整文档: : 灵活的正则表达式Generex的目标是允许与典型的正则表达式引擎相同类型的模式匹配,分析,解析和搜索,但它不仅可以将自身限制为匹配字符串中的字符,还可以与任何对象数组进行匹配。 例如,假设您有一...

    完美Email验证正则表达式

    际域名格式如下: 域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或减号)任意组合而成, 但开头及结尾均不能含有“-”,“-”不能连续出现 。 域名中字母不分大小写。域名最长可达60个字节(包括后缀.com...

    Java-PHP-C#

    让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学...

    editplus 代码编辑器html c++ jsp css

    括号在正则表达式中表示,文本中的字符匹配括号中任意一个字符即符合查找条件。 (3)按一下空格键,添加空格符。空格符是空行的一个组成成分。 (4)选择“制表符”,添加代表制表符的“\t”。 (5)移动光标,将...

    Editplus 3[1].0

    括号在正则表达式中表示,文本中的字符匹配括号中任意一个字符即符合查找条件。 (3)按一下空格键,添加空格符。空格符是空行的一个组成成分。 (4)选择“制表符”,添加代表制表符的“\t”。 (5)移动光标,将...

    java弱口令验证的代码

    包含连续或多个重复字符(如abc,123,111,bbb)、键盘连续字符(如qwe,!@#,qaz)、关键字的验证(如admin,root,user),不用引jar文件,导入项目直接可用

Global site tag (gtag.js) - Google Analytics