您的浏览器不支持CSS3,建议使用Firfox、Chrome等浏览器,以取得最佳显示效果

正则表达式学习总结

计算机科学 259℃ 0 3年前 (2014-10-08)

元字符

.                任意字符,不含换行符
*                任意多个字符,可以为0个
?                单个字符
\n                换行符
\s                任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等(注意s为小写)
\d                数字
\w                字母、数字、下划线或汉字
\b                单词的开始或结束
^                字符串的开始
$                字符串的结束
 
 

转义字符

\.                “.”
\*                “*”
\\                “\”自身
\(                “(”
需要使用转义字符的字符有    .    *    ?    ^    $    +    \    (    )    [    ]    {    }    |
 
 

限定符

*                    重复零次或更多次
+                    重复一次或更多次
?                    重复零次或一次
{n}                重复n次
{n,}                重复n次或更多次
{n,m}            重复n到m次
|                     分支条件符
 
 

字符示例

[0-9]                    单个数字,等价于\d
[aeiou]                a、e、i、o或u
[a-z0-9A-Z_]        大小写字母、数字及下划线,等价于\w(只考虑英文时)
 
 

反义代码

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

后向引用

\1                            分组1匹配的文本(默认分组组号以分组时的左括号'(‘为准)
(?<Word>\w+)
(?’Word’\w+)            指定“\w+”的组名为“Word”,使用“\k<Word>”来引用
 
 

捕获

(exp)                    匹配exp,并捕获文本到自动命名的组里
(?<name>exp)    匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
(?:exp)                    匹配exp,不捕获匹配的文本,也不给此分组分配组号
 
 

注释

(?#comment)        这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
 
 

零宽断言

(?=exp)           零宽度正预测先行断言,断言其后为exp
(?<=exp)        零宽度正回顾后发断言,断言其前为exp
(?!exp)            零宽度负预测先行断言,断言其后不为exp
(?<!exp)          零宽度负回顾后发断言,断言其前不为exp
 
此处exp不应为.*等通配符,否则出错
 
例:
(?=exp)
断言自身出现的位置的后面能匹配表达式exp
对于“I’m dancing”,表达式“\b\w+(?=ing\b)”会匹配“ing\b”前的“danc”
 
(?<=exp)
断言自身出现的位置的前面能匹配表达式exp
对于“I’m reading”,表达式“(?<=\bre)\w+\b”会匹配“\bre”后的“ading”
 
 

平衡组/递归匹配

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

举例

如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来:

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

匹配嵌套的<div>标签:

<div[^>]*>[^<>]*(((?’Open'<div[^>]*>)[^<>]*)+((?’-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>
 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

0

暂无评论

评论前:需填写以下信息,或 登录

用户登录

忘记密码?