正则表达式(笔记)

简介:
用途:
1.数据验证
2.查找
3.替换




特殊字符(元字符):




^ :匹配字符串的开始
(对前面的字符)
* :0个或者一个或者多个
+ :一个或者多个
?:0个或者一个
() :子表达式
[] : 中括号表达式   范围表达式?
{} : 标记限定表达式            后面三种有什么不同吗?


$ :abc]$表示以abc结尾


^[0-9]+abc$ 
表示匹配1个或者多个数字和abc结尾的字符串   比如:  123abc


语法:
由普通字符和特殊字符组成
特殊字符:上面那些


限定符:




确定匹配的次数
*      
+

{n}      确定匹配n次
{n,}   至少匹配n次
{n,m} 至少匹配n次,至多匹配m次


贪婪和最小匹配:
用*元字符的话,他会匹配最大的那个给你


/<\w+?>/      ????    /W的意思是 字母吗?
只匹配章节而不匹配交叉引用    这句话怎么理解?






定位符:




作用:
行首或者行尾
单词内,单词开头,单词结尾


^ : 行首
$ : 行尾
\b : 字的边界
\B : 非字边界


例子:
前面的^[0-9]*abc$     表示唯一的数字的abc的字符串组合
\b  /\bCha/     表示只要 Cha开头的单词
    /ter\b/     表示只要ter结尾的单词
\B   /\Bapt/     表示不要apt开头的单词




选择???




(选择项)用|分隔
副作用:  相关的匹配会被缓存,此时可用?:放在第一个选项来消除这种副作用


其中 ?: 是非捕获元之一,还有两个非捕获元是 ?= 和 ?!,
这两个还有更多的含义,
前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,
后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串






反向引用:
对一个正则表达式的模式或者部分模式加一个圆括号:
将相关匹配存储到一个临时缓冲区中,每个子匹配按顺序储存,编号从1开始到99
每个缓存都可以用/n 访问
可以使用非捕获元字符?:、?=、?!来重写捕获,忽略对相关匹配的保存。




var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
看不太懂


var str = "http://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
看不太懂


元字符补充:
\ :反斜杠,
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。    看不太懂


. :要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式  
  |  这个字符就是或的意思,所以很好理解


(pattern) : 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到


(?:pattern) :只匹配,不获取,不储存
'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
这里是一个或的表达式


(?=pattern) 正向肯定预查(look forward positive assert) 非获取匹配
"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。
预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。


(?!pattern) 正向否定预查(negative assert) 非获取匹配
如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"
预查不消耗字符


(?<=pattern) 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"


(?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。




[xyz] : 字符集合。匹配所包含的任意一个字符。例如[abc]可以匹配plain中的a


[^xyz] : 负值字符。   plain 匹配 p l i n


[a-z] : 匹配a-z


\d : 匹配数字字符  相当于[0-9]


\D : 匹配非数字字符 相当于[^0-9]


\f : 匹配换页符  相当于\x0c和 \cL


\n : 匹配换行符  相当于\x0a和\cJ


\r :匹配一个回车符   相当于\x0d和 \cM


\s : 匹配任何空白字符  包括空格,制表符,换页符,换行符


\S : 匹配任何非空白字符  [^\f\n\t\r\v]


\t : 匹配一个制表符


\v : 匹配一个垂直制表符  等价于 \x0b和 \cK


\w : 匹配字母,数字,下划线。    等价于[A-Za-z0-9]


\W :  匹配非字母,数字,下划线。


\xn : 匹配n,其中n为16进制转义值。
例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。看不懂这句话


\num : num是一个正整数,对所获取的匹配的引用。 "(.)\1" 匹配2个连续的相同字符


\n : 标识一个八进制转义值或一个向后引用。如果\n使用前,有n个获取的子表达式,则n为向后引用


\nm ; 如果前面至少有nm个获取的子表达式,则nm为向后引用,如果前面至少n个获取的子表达式,则n为后面跟字符m的向后引用


\nml : 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml


\un : 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。


正则表达式中运算符的优先级:
括号
限定
定位



匹配规则:
1.[^]     ^在[]里面表示非


通用字符簇:
[[:alpha:]]   描述:任何字母
[[:digit:]]    描述: 任何数字
[[:alnum:]] 描述:任何字母和数字
[[:space:]] 描述:任何空白字符
[[:upper:]] 描述:任何大写字母
[[:Lower:]] 描述: 任何小写字母
[[:punct:]] 描述:任何标点符号
[[:xdigit:]]    描述:任何16进制数字


放几个例子吧:(难度比较大的是最后一个)
^[a-zA-Z0-9_]{1,}$      // 所有包含一个以上的字母、数字或下划线的字符串 
^[1-9][0-9]{0,}$        // 所有的正整数 
^\-{0,1}[0-9]{1,}$      // 所有的整数 
^[-]?[0-9]+\.?[0-9]+$   // 所有的浮点数










 

猜你喜欢

转载自blog.csdn.net/holiday19950913/article/details/79446159