正则入门
1.1 元字符介绍
“^”:^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。
“$”:$会匹配行或字符串的结尾 。
如图 :
而且被匹配的字符必须是以 This 开头有空格也不行,必须以 Regex 结尾,也不能有空 格与其它字符
“\b” 不会消耗任何字符只匹配一个位置,常用于匹配单词边界:
例如:从字符串中”This is Regex”匹配单独的单词 “is” 正则就要写成 “\bis\b” \b 不会匹配 is 两边的字符,但它会识别 is 两边是否为单词的边界。
“\d” 匹配数字:
例如:匹配一个固定格式的电话号码以0开头前4位后7位,如0737-5686123 正 则:^0\d\d\d-\d\d\d\d\d\d\d $ 这里只是为了介绍”\d”字符,实际上有更好的写法在后面。
“\w” 匹配字母,数字,下划线:
例如:匹配”a2345BCD__TTz” 正则:”\w+” 这里的”+”字符为一个量词指重复的次数。
“\s” 匹配空格:
例如:字符 “a b c” 正则:”\w\s\w\s\w” 一个字符后跟一个空格,如有字符间有多个空 格直接把”\s” 写成 “\s+” 让空格重复。
“.” 匹配除了换行符以外的任何字符:
这个算是”\w”的加强版,”\w”不能匹配 空格 如果把字符串加上空格用”\w”就受限
了,看下用 “.”是如何匹配字符”a23 4 5 B C D__TTz” 正则:”.+”。
“[abc]” 字符组 匹配包含括号内元素的字符:
这个比较简单了只匹配括号内存在的字符,还可以写成[a-z]匹配 a 至 z 的所以字母就 等于可以用来控制只能输入英文了。
1.2 几种反义
写法很简单改成大写就行了,意思与原来的相反,这里就不举例子了
“\W”:匹配任意不是字母,数字,下划线的字符
“\S”:匹配任意不是空白符的字符
“\D”:匹配任意非数字的字符
“\B”:匹配不是单词开头或结束的位置 “[^abc]” 匹配除了 abc 以外的任意字符
1.3 量词
先解释关于量词所涉及到的重要的三个概念:
贪婪(贪心) 如”*”字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多 的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一 个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗最大。
懒惰(勉强) 如 “?” 懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配, 每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。
占有 如”+” 占有量词会覆盖事个目标字符串,然后尝试寻找匹配内容 ,但它只尝试一 次,不会回溯,就好比先抓一把石头,然后从石头中挑出黄金
。
“*”(贪婪) 重复零次或更多:
例如:”aaaaaaaa” 匹配字符串中所有的 a 正则: “a*” 会出到所有的字符”a”。
“+”(懒惰) 重复一次或更多次:
例如:”aaaaaaaa” 匹配字符串中所有的 a 正则: “a+” 会取到字符中所有的 a 字 符, “a+”与”a*”不同在于”+”至少是一次而”*” 可以是 0 次。
稍后会与”?”字符结合来体现这种区别
“?”(占有) 重复零次或一次:
例如:”aaaaaaaa” 匹配字符串中的 a 正则:”a?”只会匹配一次,也就是结果只是单个字 符a。
“{n}” 重复n次:
例如:从”aaaaaaaa” 匹配字符串的 a 并重复 3 次 正则: “a{3}” 结果就是取到 3 个 a 字符 “aaa”。
“{n,m}” 重复n到m次:
例如:正则 “a{3,4}” 将 a 重复匹配 3 次或者 4 次 所以供匹配的字符可以是三个”aaa”也 可以是四个”aaaa” 正则都可以匹配到。
“{n,}” 重复n次或更多次,与{n,m}不同在于匹配的次数没有上限,至少要重复n次
例如:正则”a{3,}” a 至少要重复 3 次 把量词了解了之后之前匹配电话号码的正则现在就可以改得简单点了^0\d\d\d-\d\d\d\d\d\d\d$ 可以改为”^0\d+-\d{7}”面的区号没有做限定,以至于可以输入很多们,而通常 只能是 3 位或者 4 位,现在再改一下 “^0\d{2,3}-\d{7}”如此一来区号部分就可以匹配3位或者4位的了。
1.4 懒惰限定符
“*?” 重复任意次,但尽可能少重复
如 “acbacb” 正则 “a.*?b” 只会取到第一个”acb” 原本可以全部取到但加了限定符 后,只会匹配尽可能少的字符 ,而”acbacb”最少字符的结果就是”acb”。
“+?” 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复 1 次。
“??” 重复0次或1次,但尽可能少重复
如 “aaacb” 正则 “a.??b” 只会取到最后的三个字符”acb”。
“{n,m}?” 重复n到m次,但尽可能少重复
如 “aaaaaaaa” 正则 “a{0,m}” 因为最少是 0 次所以取到结果为空。
“{n,}?” 重复 n 次以上,但尽可能少重复
如 “aaaaaaa” 正则 “a{1,}” 最少是 1 次所以取到结果为 “a”。
正则进阶
2.1 捕获分组
先了解在正则中捕获分组的概念,其实就是一个括号内的内容 如 “(\d)\d” 而”(\d)” 这就 是一个捕获分组,可以对捕获分组进行 后向引用 (如果后而有相同的内容则可以直接引用前面 定义的捕获组,以简化表达式) 如(\d)\d\1 这里的”\1”就是对”(\d)”的后向引用 那捕获分组有什么用呢?
如 “zery zery” 正则 \b(\w+)\b\s\1\b 所以这里的”\1”所捕获到的字符也是 与(\w+)一样的 “zery”,为了让组名更有意义,组名是可以自定义名字的 “\b(?\w+)\b\s\k\b” 用”?”就可以自定义组名了而要后向引用组 时要记得写成 “\k”;自定义组名后,捕获组中匹配到的值就会保存在定义的组名里 下面列出捕获分组常有的用法。
“(exp)” 匹配 exp,并捕获文本到自动命名的组里
“(?exp)” 匹配 exp,并捕获文本到名称为 name 的组里
“(?:exp)” 匹配exp,不捕获匹配的文本,也不给此分组分配组号
以下为零宽断言
“(?=exp)” 匹配exp前面的位置
例如:”How are you doing” 正则”(?.+(?=ing))” 这里取 ing 前所有的字符,并定义 了一个捕获分组名字为 “txt” 而”txt”这个组里的值为”How are you do”。
“(?<=exp)” 匹配exp后面的位置
例如:”How are you doing” 正则”(?(?<=How).+)” 这里取”How”之后所有的字符, 并定义了一个捕获分组名字为 “txt” 而”txt”这个组里的值为” are you doing”。
“(?!exp)” 匹配后面跟的不是exp的位置
例如:”123abc” 正则 “\d{3}(?!\d)”匹配 3 位数字后非数字的结果。