`
yimi128
  • 浏览: 56115 次
  • 来自: ...
社区版块
存档分类
最新评论

正则表达式--获取匹配和非获取匹配

 
阅读更多

    在使用正则表达式的时候,我们经常会使用()把某个部分括起来,称为一个子模式。

 

    子模式有Capturing和Non-Capturing两种情况。

 

    Capturing指获取匹配 ,是指系统会在幕后将所有的子模式匹配结果保存起来,供我们查找或者替换。如后向引用的使用;

    而Non-Capturing指非获取匹配 ,这时系统并不会保存子模式的匹配结果,子模式的匹配更多的只是作为一种限制条件使用,如正向预查,反向预查,负正向预查,负反向预查等。

 


后向引用

使用"\数字"代表前面某个子模式的匹配内容

 

    我们使用正则表达式,在很多场景下的作用是为了查找和替换,大部分语言的正则表达式实现中,在查找时,使用后向引用来代表一个子模式,语法是"\数字",而在替换中,语法是"$数字"。

    在正则表达式中,我们可以使用 "\数字 " 来进行后向引用,数字 表示这里引用的是前面的第几个子模式。如下:

 

Text
<h1>This is a valid header</h1>
<h2>This is not valid.</h3>
RegEx
<h([1-6])>.*?</h\1 >
Result
<h1>This is a valid header</h1>
<h2>This is not valid.</h3>

 

 

    上面示例中,\1代表前面的子模式([1-6])的匹配结果 1,所以不符合的匹配<h2>..</h3>并没有被匹配。

    后向应用常见的应用常见是:

  • 匹配重复单词 (\w+) \1
  • 匹配合法的html标记,如上例。

 

非获取匹配

在子模式内部前面添加"?:"

 

    非获取匹配表示这个子模式的匹配内容不会被保存,不能用于后向引用中。简单说,非获取匹配就是 只匹配,不保存。看个例子:

 

Text
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
RegEx
Windows (?:[\w]+\b)
Result
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

 

    在这个例子中,子模式(?:[\w]+\b)是一个非获取匹配,只匹配内容,单并未保存字匹配的结果。

 

正向预查

在子模式的内部前面添加"?="

 

    正向预查的意思是,子模式仅仅作为条件限制,并不作为匹配结果输出,子模式前面的。

 

Text
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
RegEx
Windows(?= [\d]+\b)
Result
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

 

    这个例子中,要获取所有后面带有数字的Windows字符串。子模式在这里仅仅作为一个限制条件使用,仅参与匹配过程,并不作为匹配结果输出。

 

    负正向预查的作用正好与正向预查相反,语法为在子模式内部前面增加"?!"。

 

    比如上面例子,如果RegEx为Windows(?! [\d]+\b),则匹配的结果会是Windows Xp和Windows Vista中的windows。

 

反向预查

在子模式的内部前面添加"?<="

 

    反向预查与正向预查很相似,子模式仅仅作为条件限制,不作为结果输出,唯一的不同是,正向预查匹配子模式前面的结果作为匹配结果,而反向预查匹配子模式后面的结果作为匹配结果。看个例子:

 

Text
CNY:100.2
USD:222.1
USD:301.3
HKD:122.1
CNY:114.4
 RegEx
(?<=CNY:)\d+\.\d
Result
CNY:100.2
USD:222.1
USD:301.3
HKD:122.1
CNY:114.4

 

    这个例子里,要获取属于CNY的金额。子模式仅参与匹配过程,并不作为匹配结果输出。

 

 

    负反向预查的作用正好与反向预查相反,语法为在子模式内部前面增加"?<!"。

 

    比如上面例子,如果RegEx为(?<!CNY:)\b\d+\.\d,则会获取不属于CNY的金额.

分享到:
评论

相关推荐

    EXCEL-VBA-正则表达式-从实例开始.docx

    正则表达式(Regular Expression),简称“regex”或“regexp”,是一种强大的文本模式匹配工具,广泛应用于多种编程语言中,用于进行复杂的文本搜索和处理任务。尽管正则表达式的概念并非VBA所独有,但在Excel VBA...

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

    正则表达式是计算机科学中一种非常强大的文本处理工具,在Java等编程语言中广泛应用于字符串匹配、搜索替换等场景。当需要对正则表达式的部分结果进行进一步处理时(如重复使用或修改),可以通过分组来实现这一目标...

    易语言正则表达式类匹配中文

    在易语言中,正则表达式类是一个非常重要的工具,用于处理字符串的模式匹配和查找。在处理中文文本时,这个功能尤为关键,因为中文字符的编码和处理方式与英文有所不同。 正则表达式是用于匹配字符串模式的一种强大...

    正则表达式在数据库查询中的应用

    ### 正则表达式在数据库查询中的应用 #### 引言 在数据库管理与应用程序开发中,查询数据是一项常见的任务。...然而,在使用正则表达式时也需要考虑到潜在的性能和安全问题,确保其在实际应用中的有效性和可靠性。

    kettle 根据系统时间加正则表达式动态匹配获取多个文本文件

    kettle 根据系统时间加正则表达式动态匹配获取多个文本文件

    PB实现的正则表达式

    4. 处理结果:检查匹配结果,获取匹配的子串,或进行替换等操作。 需要注意的是,由于PowerBuilder 11.5年代较久,其支持的正则表达式功能可能相对较弱,对于现代的复杂正则表达式语法可能不完全兼容。在使用时,...

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

    :pattern)”表示非获取匹配,用于组合模式的各个部分。 此外,正则表达式还支持正向预查和负向预查功能: - 正向预查表示匹配某个模式的字符串必须紧跟在指定的查找字符串之后。 - 负向预查表示匹配某个模式的字符...

    Lucene 使用正则表达式

    它接受一个`Term`对象作为参数,该对象包含待匹配字段名和正则表达式。通过这种方式,可以在索引文档中查找符合特定模式的记录。 #### 示例代码解析 1. **索引创建**: ```java IndexWriter writer = new ...

    正则表达式---Python程序设计1

    正则表达式还支持两种匹配模式:贪婪匹配和懒惰(非贪婪)匹配。默认情况下,正则表达式采用贪婪模式,即尽可能多地匹配文本。例如,若要匹配 `&lt;a&gt;` 和 `&lt;b&gt;` 之间的所有文本,可以使用以下正则表达式: ```python ...

    精通正则表达式-第三版-简体中文版

    2. **模式匹配算法**:了解DFA(确定有限状态自动机)和NFA(非确定有限状态自动机)的区别,有助于理解不同语言中的正则表达式行为。 3. **正则表达式调试**:许多工具和语言提供了调试功能,帮助理解匹配过程。 ...

    JAVA正则表达式--Pattern和Matcher

    ### JAVA正则表达式——Pattern和Matcher详解 #### 一、引言 随着JDK 1.4的发布,Java终于内置了自己的正则表达式API,这对于Java开发者来说无疑是个福音,意味着不再需要依赖第三方库就能高效地处理文本数据。Java...

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

    - **定义**:`grep` 是 Linux 和 Unix 系统中的一种强大的文本搜索工具,它能够使用正则表达式来搜索文本,并将匹配的行打印出来。其全称是 Global Regular Expression Print,意为全局正则表达式版本。 - **功能**...

    pb 使用正则表达式源码pbregexp

    5. **捕获组**:提取匹配的子串,特别是对于包含括号的正则表达式,可以获取多个匹配部分。 6. **修饰符**:如全局匹配(g)使匹配不局限于第一个出现的位置,忽略大小写(i)等。 “pbregexp”组件可能提供了相应...

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

    Java中提供了对正则表达式的支持,使得开发者可以使用正则表达式来匹配和提取字符串中的内容。 二、XML节点内容提取方法 在Java中,可以使用正则表达式来提取XML节点内容。下面是一个简单的示例: ```java public ...

    C语言正则表达式库

    1. **语法兼容性**:如描述所述,PCRE库的正则表达式语法与Perl语言高度兼容,这意味着开发者可以利用Perl中广泛使用的正则表达式语法,如贪婪和非贪婪量词、分支选择、反向引用等。 2. **Unicode支持**:PCRE库...

    正则表达式入门与提高---整理版_VBa_正则式_

    对于每个匹配项,我们可以访问它的`Value`属性获取匹配的文本,或者使用`FirstIndex`和`Length`属性获取匹配的位置。例如: ```vba For Each match In matches Debug.Print match.Value '打印匹配的文本 Next ...

    JAVA正则表达式大全

    这份文档可能深入讲解了`Pattern`和`Matcher`类的用法,如`Pattern.compile()`用于编译正则表达式,`Matcher.find()`用于查找字符串中的匹配部分,`Matcher.group()`获取匹配的子串,以及如何使用`Pattern.split()`...

    正则表达式-基础知识

    - **示例**:假设我们有字符串 `"abc123"`,使用正则表达式 `.` 来匹配,则每个字符都会被匹配到。 2. **`*`(星号)** - **作用**:表示前一个字符可以出现0次或多次。 - **示例**:如果要匹配 `"aaabbbccc"` ...

    VC、VC++,MFC 正则表达式类库

    正则表达式类库则为VC++和MFC的开发者提供了对正则表达式功能的支持。 "VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式...

Global site tag (gtag.js) - Google Analytics