`
snowstone
  • 浏览: 20006 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

正则表达式-不包含某个字符串

 
阅读更多

   在使用正则表达式的场合,常常有这种需求,就是匹配一个不包含某个子串的子符串。比如说,我要从“eabcdfgh”得到"cd"之前的子串。有些人可能会写:

([^cd]*)

这种写法是彻底错误的,因为[]中的是集合,也就是说,[^cd]表示不等于c或者d,而不是cd。下面的程序中没有cd,但eab还是被匹配出来了。

 

String s = "([^cd]*)"; 
Match m = Regex.Match("eabcfgh", s); 
MessageBox.Show(m.Value);//eab 
MessageBox.Show(m.Groups[1].Value);//eab 

 

    上面这种写法是错的比较离谱的,正常青年一般都可以避免这种错误。在特殊情况下,正则表达式可以这么写,而且效率是比较高的。

([/s/S]*cd)

先说明下/s/S是表示匹配任何字符。所谓特殊情况,就是我知道这个字符串中必有cd的存在。假如,我的要求是匹配不包含cd的部分(为了描述方便,只匹配cd之前的部分),也就是说,当cd不存在时,应该把整个字符串都取出来。

String s = "((.(?!cd))*.)"; 
//String s = "([/s/S]*cd)"; 
Match m = Regex.Match("eabcdfgh", s); 
MessageBox.Show(m.Value);//eab 
MessageBox.Show(m.Groups[1].Value);//eab 

 这种写法终于符合要求了。不过值得一提的是,相较前一种而言,它的效率比较低。

回顾一下相关的语法:

(?:子表达式)         定义非捕获组。

//定义非捕获组 
String s = "e(?:ab)(.*)"; 
Match m = Regex.Match("eabcd", s); 
MessageBox.Show(m.Value);//eabcd 
MessageBox.Show(m.Groups[1].Value);//cd 

 ab是被匹配的,但是它所在的组没有被捕获,Group[1]是cd

(?=子表达式)       零宽度正预测先行断言。

//零宽度正预测先行断言 
//String s = "b(cd|de)(.*)"; 
String s = "b(?=cd|de)(.*)"; 
Match m = Regex.Match("eabcdfg", s); 
MessageBox.Show(m.Value); 
MessageBox.Show(m.Groups[1].Value);//区别 cd  cdfg 

 这种写法和注释掉的写法是有区别的,区别就是“零宽度”,这种写法会被捕获,也就是不占一个Group。

(?!子表达式)       零宽度负预测先行断言。

!表示非,就是不包含,同样是零宽度,不会被捕获。

 

(?<=子表达式)    零宽度正回顾后发断言。

例:(?<=19)\d{2}\b

“1851 1999 1950 1905 2003”中的“99”、“50”和“05”

(?<!子表达式)     零宽度负回顾后发断言。

例:(?<!19)\d{2}\b

“1851 1999 1950 1905 2003”中的“51”和“03”

参考文章: http://msdn.microsoft.com/zh-cn/library/az24scfc.aspx

          http://jianshusoft.blog.51cto.com/2380869/766007

分享到:
评论

相关推荐

    正则表达式不包涵特殊字符(除了 指定字符 以外)

    在探讨如何利用正则表达式来判断一个字符串除指定字符外不包含其他特殊字符之前,我们首先需要了解正则表达式的基本概念以及本场景中的具体需求。 ### 正则表达式简介 正则表达式是一种强大的文本处理工具,能够...

    人工智能-项目实践-信息检索-用C++实现的基于NTFS下MFT和USN-Journal检索与类正则表达式-NFA-DFA字符串

    标题中的“人工智能-项目实践-信息检索-用C++实现的基于NTFS下MFT和USN-Journal检索与类正则表达式-NFA-DFA字符串”表明这是一个关于人工智能领域,特别是信息检索技术的项目实践。这个项目的核心是用C++编程语言...

    java-正则表达式-正则表达式元素介绍

    在Java中,你可以使用`matches()`方法来检查一个字符串是否完全符合某个正则表达式模式,`split()`方法将字符串根据正则表达式分割成多个子字符串,以及`replaceAll()`方法替换字符串中符合正则表达式的部分。...

    正则表达式---------资料整理,适合新手学习使用,对正则表达式的学习很有帮助

    正则表达式是强大的字符串匹配模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。下面是正则表达式的基本概念和运用方法: 1. 正则表达式的历史:正则表达式...

    java-正则表达式-分组引用介绍

    当正则表达式包含多个分组时,需要特别注意如何正确地确定每个分组的编号: - **确定多分组的分组数**:可以通过统计圆括号的数量来确定分组的总数。从左至右数左括号或从右至左数右括号,每一对括号构成一个分组。...

    python正则表达式匹配不包含某几个字符的字符串方法

    本文将分享如何使用Python正则表达式来匹配不包含特定字符集的字符串。 首先,我们来看一个基本的正则表达式匹配例子。假设我们要从一个字符串中找出所有以“https?”开头,后面跟着“://”,然后再以“.jpg”、“....

    jJAVA正则表达式替换字符

    其中包括5个类,这5个类的代码基本概括了java正则表达式替换String的多种情况,比如获取某个文件路径中盘符/后边的部分内容,提取"&lt;title&gt;XXXX&lt;/title&gt;"中的文字XXXX,用正则表达式获取指定字符串内容中的指定内容,...

    正则表达式 到 nfa dfa

    正则表达式是一种强大的文本处理工具,用于匹配和操作字符串。它们在编程语言、文本编辑器和搜索引擎等众多领域有着广泛的应用。NFA(非确定性有限状态自动机)和DFA(确定性有限状态自动机)是计算理论中用于识别...

    Java使用正则表达式提取XML节点内容的方法示例

    这个正则表达式的意思是:匹配任何以 `&gt;` 开始,以 `结束,并且中间可以包含任何字符(包括 `和 `&gt;`)的字符串。 三、正则表达式在线测试工具 为了方便开发者测试和调试正则表达式,我们提供了两个非常方便的正则...

    第4章 数据处理-php正则表达式-郑阿奇(续)

    正则表达式的主要功能包括有效性验证、替换文本和提取子字符串。使用正则表达式,可以对用户输入的数据进行验证,确保它们符合特定的格式要求;也可以通过正则表达式来查找并替换文本中的特定部分;或者提取出文本中...

    正则表达式 不包含特定单词 字符串

    项目中输入框需要验证不能输入root或者admin,不区分大小写。 琢磨了很久,写出来了正则如下: /^(?!root|admin)|\broot.+|\badmin.+/i tips:如果是写在java里,\b前面需要加转义符,写成\\b 如果你觉得有用,...

    文本三剑客之grep及正则表达式 -.pdf

    - **fgrep (grep -F)**:固定字符串搜索,不支持正则表达式。适合用于查找固定的字符串,而非模式匹配。 #### 4. grep 的实战演示 - **示例一**:使用 `grep` 对磁盘利用率进行倒序排序。 ```bash [root@...

    Python培训基础入门教程-正则表达式-讲解全面 共29页.pdf

    正则表达式(Regular Expression,缩写为RE)是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在 Python 中,正则表达式是处理文本和数据的重要工具。 知识点1:字符串匹配 * 字符串匹配是...

    VB 正则表达式 使用详解

    例如,可以使用正则表达式来测试字符串的某个模式,替换文本、根据模式匹配从字符串中提取一个子字符串等。 使用正则表达式可以带来以下优势: * 提高字符串处理的效率和灵活性 * 实现数据有效性验证 * 实现文本...

    正则表达式实现将MM/DD/YYYY格式的日期转换为YYYY-MM-DD格式

    首先,正则表达式是一种用于匹配字符串中字符组合的模式。它通常被用于文本搜索、替换操作中。在处理文本和数据时,正则表达式因其强大而灵活的特点,而被广泛用于各个编程语言和工具中。在这里,它被用来识别特定的...

    正则表达式.docx

    * 字符串查找:使用正则表达式来查找字符串中符合某个规则的子字符串。 * 字符串替换:使用正则表达式来替换字符串中符合某个规则的子字符串。 * 字符串分割:使用正则表达式来将字符串分割成多个子字符串。 七、...

    VB正则表达式简介

    正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 在 VBScript 中使用正则表达式可以明显改善字符串处理能力。VBScript 是 Visual Basic 的一个子集,具有丰富的字符串处理功能。正则表达式语法...

    正则表达式翻译工具,RegexTest.exe

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于匹配、查找、替换或提取特定模式的字符串。RegexTest.exe 是一个专门用于测试和解析正则表达式的应用程序,它可以帮助用户理解和调试...

    正则表达式 到 NFA

    正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 本实例的符号包括: 1. 基本正则表达式, 如ab 2. 重复, 如a* 3. 在各项中选择, 如a|b 使用时在Convert的Reg Exp中...

Global site tag (gtag.js) - Google Analytics