加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:19:03 所属栏目:百科 来源:网络整理
导读:正则表达式就是应用在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。 元字符,metacharacter: . 匹配除换行符以外的任意字符 w 匹配字母或数字或下划线或汉字 s 匹配任意的空白符 d 匹配数字 b 匹配单词的开始或结束 ^

正则表达式就是应用在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。


元字符,metacharacter:

. 匹配除换行符以外的任意字符
w 匹配字母或数字或下划线或汉字
s 匹配任意的空白符
d 匹配数字
b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

* 前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。
- 不是元字符,只匹配它本身
d{2} d必须连续重复匹配2次


字符转义:查找元字符,在其前面加上


字符类:[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!),指定一个字符范围,像[0-9]代表的含意与d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于w(如果只考虑英文的话)


分支条件;正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开,匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件。


分组:子表达式(也叫做分组)用小括号()表示,可以指定这个子表达式的重复次数


反义:

W 匹配任意不是字母,数字,下划线,汉字的字符
S 匹配任意不是空白符的字符
D 匹配任意非数字的字符
B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符


后向引用:用于重复搜索前面某个分组匹配的文本。

捕获
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读


零宽断言:

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=bre)w+b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。


负向零宽断言:(?!exp),断言此位置的后面不能匹配表达式exp

一个更复杂的例子:(?<=<(w+)>).*(?=</1>)匹配不包含属性的简单HTML标签内里的内容。(?<=<(w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=</1>)。注意后缀里的/,它用到了前面提过的字符转义;1则是一个反向引用,引用的正是捕获的第一组,前面的(w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。


注释:

(?<= # 断言要匹配的文本的前缀
<(w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
) # 前缀结束
.* #匹配任意文本
(?= # 断言要匹配的文本的后缀
</1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束


贪婪与懒惰:

贪婪匹配模式.*会匹配整个字符串。
懒惰匹配模式.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复


处理选项:

IgnoreCase(忽略大小写) 匹配时不区分大小写。
Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是: 匹配n之前的位置以及字符串结束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符n)。
IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

在C#中,你可以使用Regex(String,RegexOptions)构造函数来设置正则表达式的处理选项。如:

Regex regex = new Regex(@"baw{6}b",RegexOptions.IgnoreCase);


平衡组/递归匹配
(?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
(?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
(?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败


< #最外层的左括号
[^<>]* #最外层的左括号后面的不是括号的内容
(
(
(?'Open'<) #碰到了左括号,在黑板上写一个"Open"
[^<>]* #匹配左括号后面的不是括号的内容
)+
(
(?'-Open'>) #碰到了右括号,擦掉一个"Open"
[^<>]* #匹配右括号后面不是括号的内容
)+
)*
(?(Open)(?!)) #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败


> #最外层的右括号


其他:

a报警字符(打印它的效果是电脑嘀一声) b通常是单词分界位置,但如果在字符类里使用代表退格 t制表符,Tab r回车 v竖向制表符 f换页符 n换行符 eEscape nnASCII代码中八进制代码为nn的字符 xnnASCII代码中十六进制代码为nn的字符 unnnnUnicode代码中十六进制代码为nnnn的字符 cNASCII控制字符。比如cC代表Ctrl+C A字符串开头(类似^,但不受处理多行选项的影响) Z字符串结尾或行尾(不受处理多行选项的影响) z字符串结尾(类似$,但不受处理多行选项的影响) G当前搜索的开头 p{name}Unicode中命名为name的字符类,例如p{IsGreek} (?>exp)贪婪子表达式 (?<x>-<y>exp)平衡组 (?im-nsx:exp)在子表达式exp中改变处理选项 (?im-nsx)为表达式后面的部分改变处理选项 (?(exp)yes|no)把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no (?(exp)yes)同上,只是使用空表达式作为no (?(name)yes|no)如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no (?(name)yes)同上,只是使用空表达式作为no

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读