正则表达式组详解

开发 后端
正则表达式组是什么呢?这里通过向你介绍正则表达式组和向后应用的理解向你渗透解析,希望对你理解正则表达式组有所帮助。

正则表达式组与向后引用的关系是什么呢?我们在学习正则表达式组的时候需要注意什么呢?那么这里我们来详细的看看具体的到底有什么是关键点。

正则表达式组的理解

把正则表达式的一部分放在圆括号内,你可以将它们形成组。然后你可以对整个组使用一些正则操作,例如重复操作符。

要注意的是,只有圆括号“()”才能用于形成组。“[]”用于定义字符集。“{}”用于定义重复操作。

当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。当对被匹配的组进行向后引用的时候,可以用“\数字”的方式进行引用。﹤﹤\1﹥﹥引用***个匹配的后向引用组,﹤﹤\2﹥﹥引用第二个组,以此类推,﹤﹤\n﹥﹥引用第n个组。而﹤﹤\0﹥﹥则引用整个被匹配的正则表达式本身。我们看一个例子。

假设你想匹配一个HTML标签的开始标签和结束标签,以及标签中间的文本。比如﹤B﹥This is a test﹤/B﹥,我们要匹配﹤B﹥和﹤/B﹥以及中间的文字。我们可以用如下正则表达式:“﹤([A-Z][A-Z0-9]*)[^﹥]*﹥.*?﹤/\1﹥”

首先,“﹤”将会匹配“﹤B﹥”的***个字符“﹤”。然后[A-Z]匹配B,[A-Z0-9]*将会匹配0到多次字母数字,后面紧接着0到多个非“﹥”的字符。***正则表达式的“﹥”将会匹配“﹤B﹥”的“﹥”。接下来正则引擎将对结束标签之前的字符进行惰性匹配,直到遇到一个“﹤/”符号。然后正则表达式中的“\1”表示对前面匹配的组“([A-Z][A-Z0-9]*)”进行引用,在本例中,被引用的是标签名“B”。所以需要被匹配的结尾标签为“﹤/B﹥”

正则表达式组的相关解析:

你可以对相同的后向引用组进行多次引用,﹤﹤([a-c])x\1x\1﹥﹥将匹配“axaxa”、“bxbxb”以及“cxcxc”。如果用数字形式引用的组没有有效的匹配,则引用到的内容简单的为空。

一个后向引用不能用于它自身。﹤﹤([abc]\1)﹥﹥是错误的。因此你不能将﹤﹤\0﹥﹥用于一个正则表达式匹配本身,它只能用于替换操作中。

后向引用不能用于字符集内部。﹤﹤(a)[\1b]﹥﹥中的﹤﹤\1﹥﹥并不表示后向引用。在字符集内部,﹤﹤\1﹥﹥可以被解释为八进制形式的转码。

向后引用会降低引擎的速度,因为它需要存储匹配的组。如果你不需要向后引用,你可以告诉引擎对某个组不存储。例如:﹤﹤Get(?:Value)﹥﹥。其中“(”后面紧跟的“?:”会告诉引擎对于组(Value),不存储匹配的值以供后向引用。

正则表达式组之重复操作与后向引用

当对组使用重复操作符时,缓存里后向引用内容会被不断刷新,只保留***匹配的内容。例如:﹤﹤([abc]+)=\1﹥﹥将匹配“cab=cab”,但是﹤﹤([abc])+=\1﹥﹥却不会。因为([abc])***次匹配“c”时,“\1”代表“c”;然后([abc])会继续匹配“a”和“b”。***“\1”代表“b”,所以它会匹配“cab=b”。

应用:检查重复单词--当编辑文字时,很容易就会输入重复单词,例如“the the”。使用﹤﹤\b(\w+)\s+\1\b﹥﹥可以检测到这些重复单词。要删除第二个单词,只要简单的利用替换功能替换掉“\1”就可以了。

正则表达式组的命名和引用

在PHP,Python中,可以用﹤﹤(?P﹤name﹥group)﹥﹥来对组进行命名。在本例中,词法?P﹤name﹥就是对组(group)进行了命名。其中name是你对组的起的名字。你可以用(?P=name)进行引用。

.NET的命名组

.NET framework也支持命名组。不幸的是,微软的程序员们决定发明他们自己的语法,而不是沿用Perl、Python的规则。目前为止,还没有任何其他的正则表达式实现支持微软发明的语法。

下面是.NET中的例子:

(?﹤first﹥group)(?’second’group)

正如你所看到的,.NET提供两种词法来创建命名组:一是用尖括号“﹤﹥”,或者用单引号“’’”。尖括号在字符串中使用更方便,单引号在ASP代码中更有用,因为ASP代码中“﹤﹥”被用作HTML标签。

要引用一个命名组,使用\k﹤name﹥或\k’name’.

当进行搜索替换时,你可以用“${name}”来引用一个命名组。

正则表达式组的相关内容就向你介绍到这里,希望对你了解和学习正则表达式组有所帮助。

【编辑推荐】

  1. 实现正则表达式匹配任意字符解析
  2. 浅析正则表达式实现字符串的相关操作
  3. Java正则表达式实现条件查询浅析
  4. 正则表达式匹配单词细节解析
  5. 正则表达式的选择符探讨
责任编辑:仲衡 来源: 百度空间
相关推荐

2009-08-03 17:27:14

C#正则表达式

2009-09-16 17:29:30

正则表达式使用详解

2009-09-16 16:22:04

正则表达式匹配

2018-09-27 15:25:08

正则表达式前端

2020-09-04 09:16:04

Python正则表达式虚拟机

2009-09-16 14:32:43

PHP正则表达式替换

2011-08-16 17:28:49

iPhone SDK正则表达式

2011-08-23 17:46:09

LUA正则表达式模式

2009-08-20 16:23:32

C#正则表达式语法

2010-03-25 18:25:36

Python正则表达式

2019-07-25 17:00:44

Python正则表达式字符串

2009-09-16 14:22:44

preg_match正

2017-05-12 10:47:45

Linux正则表达式程序基础

2009-02-18 09:48:20

正则表达式Java教程

2011-06-02 12:34:16

正则表达式

2021-01-27 11:34:19

Python正则表达式字符串

2022-03-28 06:19:14

正则表达式开发

2019-07-17 15:45:47

正则表达式字符串前端

2016-11-10 16:21:22

Java 正则表达式

2022-01-04 11:35:03

Linux Shel正则表达式Linux
点赞
收藏

51CTO技术栈公众号