js正则表达札记

下载了个js正则表达式的word文档看看,也没人引路,那就这样吧。

文档内容分为4个部分:第一部分是正则表达式的一些普通规则;第二部分是正则表达式的一些高级规则;第三部分是其他通用规则;第四部分是一些提示。

 

第一部分

1.普通字符:数字、字母、汉字、下划线及没有特殊定义的标点符号,都是“普通字符”。

特殊字符,称为元字符。

 

2.转义字符:前面加“\”的字符,如:

\r,\n  是回车和换行符;

\t       是制表符;

\\    是"\"本身。

有特殊用途的符号,前面加"\",表符号本身。如:\^是^本身;\$是$本身;\.是"."本身。

 

3.能够与"多种字符"匹配的表达式

\d  匹配0~9中的任意一个数字;

\w  匹配0~9、a~z、A~Z中任意一个字符;

\s  匹配空格、制表符、换页符等空白字符的其中任意一个;

.  小数点匹配除了换行符(\n)外的任意一个字符。

 

4.自定义能够与"多种字符"匹配的表达式

[]  匹配其中任意一个字符,如:[a-z]匹配"a"~"z"之间的任意一个字符;

[^]  匹配"[]"以外的任意一个字符,如:[^a-z0-9]匹配"a"~"z"和"0"~"9"以外的任意一个字符。

 

5.修饰匹配次数的特殊符号,即重复匹配。

重复匹配,使用方法:“次数修饰”放在“被修饰表达式”后面即可。

表达式    作用

{n}    将表达式重复n次,如:[bcd][bcd]可以写为[bcd]{2};

{m,n}   重复至少m次,最多n次;

{m.}     重复至少m次;

?        重复0次或1次,相当于{0,1};

+       重复至少1次,相当于{1.};

*        可以不重复,也可以重复任意次。

 

6.一些抽象的特殊符号

表达式    作用

^    从字符串开始的地方开始匹配;不匹配任何字符。

$    从字符串结束的地方开始匹配;不匹配任何字符。

\b    匹配一个单词边界,就是单词和空格时间的位置;不匹配任何字符。(我理解的就是为字符间的空隙部分)

|    “或”,匹配"|"左边或右边的内容

()    a.被匹配数次修饰时,括号内的表达式可以作为整体被修饰;

       b. 取匹配结果时,括号内表达式匹配到的内容可以被单独得到。

举例1:表达式".\b"在匹配"@@@abc"时,匹配结果是:成功;匹配到的内容是:"@a"。

举例2:表达式"\bend\b"在匹配"weekend.endfor.end"时,结果:成功;内容是:"end";开始于15,结束于18。

举例3:表达式"Tom|Jack"在匹配"I'm Tom, he is Jack."时,结果:成功;内容"Tom";匹配一下个时,结果:成功;内容"Jack"。

举例4:表达式"(go\s*)+"在匹配"Let's go go go!"时,结果:成功;内容:"go go go"。

举例5:表达式"¥(\d+\.?\d*)"在匹配"$10.9.¥20.5"时,结果:成功;内容"¥20.5"。单独取括号内匹配的内容则为"20.5"。

 

第二部分

1.匹配次数中的贪婪和非贪婪。

个人总结的匹配原则,a.为了整个表达式能够匹配成功;b.匹配时,尽可能多或尽可能少(不)的匹配符合规则的字符。

就和追女孩子相似,在得到的前提下(a),有人挖尽心思尽可能的多从女孩子那得到更过内容,而有的人是尽可能少或不得到女孩子的那些内容。

 

贪婪:a.为了整个表达式能够匹配成功;b.匹配时,尽可能多的匹配符合规则的字符。

尽可能匹配的表达式有:"+"、"*"、"{m,n}"、"{m.}"

举例:针对"dxxxdxxxd",表达式"(d)(\w+)"将匹配第一个"d"之后的所有字符"xxxdxxxd"。表达式"(d)(\w+)(d)"将匹配第一个和最后一个"d"之间的所有字符"xxxdxxx",本来可以匹配最后一个"d"的,但由于原则限制,所以......。

 

非贪婪(也叫勉强模式):用"?",可以使匹配次数不定的表达式尽可能的少匹配,使可匹配不可匹配的表达式,尽可能“不匹配”。

尽可能少或不匹配的表达式有:"?"、"*?"、"+?"

举例:也针对"dxxxdxxxd"字符串,表达式(d)(\w+?)在匹配到第一个"d"后尽可能少的匹配其他字符,结果内容:"dx"。表达式(d)(\w+?)(d),根据匹配原则,结果内容:"dxxxd"。

 

*********2.反向引用*********

当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。

”()“包含的表达式所匹配到的字符串,不仅是在匹配结束后才可以使用,其实在匹配过程中也可以使用。表达式后面的部分,可以引用前面"括号内子匹配已经匹配到的字符串"。

引用方法:"\"+数字。

举例1:('|")(.*?)(\1)在匹配"'Hello'. "World""时,结果:成功;内容是"'Hello'"。再次匹配下一个时,匹配到""World""。

 

举例2:(\w)\1{4.}在匹配"aa bbbb abcdefg ccccc 111121111 999999999"时,结果:成功;内容是"ccccc"。再次匹配下一个时,将得到"999999999"。

 

举例3:<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>在匹配 "<td id='td1'style="bgcolor:white"></td>" 时,匹配结果是成功。如果"<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。

 

3.预搜索,不匹配;反向预搜索,不匹配。

"^","$","\b"这几个代表抽象意义的特殊符号,都有一个共同点,那就是:它们本身不匹配任何字符,只是对“字符串的两头”或“字符之间的缝隙”附加了个条件。

正向预搜索:"(?=xxx)","(?!xxx)"

格式:(?=xxx),在被匹配的字符串中,它对所处的"缝隙"或"两头"附件的条件是:所在缝隙的右侧,必须能够匹配上xxx这部分的表达式。作为附加条件,并不影响后边的表达式去真正匹配这个缝隙之后的字符。类似"\b",本身不匹配任何字符只是将所在缝隙之前、之后的字符取来进行一下判断,不会影响后面的表达式来真正的匹配。

举例1:Windows (?=NT|XP) 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的"Windows ",其他的 "Windows " 字样则不被匹配。

 

举例2:"(\w)((?=\1\1\1)(\1))+" 在匹配字符串"aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。

 

格式:(?!xxx),所在缝隙的右侧,必须不能匹配xxx这部分表达式。

举例1:"((?!\bstop\b).)+"在匹配"fdjka ljfdl stop fidsla fdj"时,将从头匹配到"stop"之前的位置,如字符串没有"stop",则匹配整个字符串。

举例2:do(?!\w)在匹配字符串"done. do. dog"时,只能匹配"do"。本例中表达式中"(?!\w)"和使用"\b"效果一样。

 

反向预搜索:"(?<=xxx)","(?!<xxx)"

附加条件:所在缝隙的”左侧“,这两种格式分别要求必须匹配和必须不能匹配指定的表达式,而不是去判断 右侧。作为附加条件,本身不匹配任何字符。

举例1:(?<=\d{4})\d+(?=\d{4})在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions命名空间等。

 

第三部分

在各个正则表达式引擎之间比较通用的规则。

1.表达式"\xXX"和"\xXXX"表示一个字符("X"表示一个十六进制数)

形式    字符范围

\xXX   编号在0~255范围的字符

\uXXXX      任何字符可以使用"\u"再加上其编号的4位十六进制数表示

 

2."\s","\d","\w","\b"表示特殊意义的同时,其大写则表示相反的意义。

表达式    可匹配

\D    匹配所有的非数字字符

\W      匹配所有的数字、字母、下划线以外的字符

\S     匹配所有非空白字符

\B     非单词边界,即左右两边都是"\w"或都不是"\w"范围时的字符缝隙

 

3.有特殊意义,需要加"\"才能匹配改字符本身的字符汇总

^

$

()

[]

{}

.

?

+

*

|

 

4.括号"()"内的子表达式,如何希望匹配结果不进行记录供以后使用,可以使用"(?:xxx)"格式。

举例1:(?:(\w)\1)+" 匹配"a bbccdd efg" 时,结果是 "bbccdd"。括号 "(?:)" 范围的匹配结果不进行记录,因此 "(\w)" 使用"\1" 来引用。


5.常用表达式属性设置简介:Ignorecase,Singleline,Multiline,Global

表达式属性        说明

Ignorecase    默认情况下,表达式中的字母是要区分大小写的。ignorecase取消区分大小写。

Singleline     默认情况下,"."匹配除了(\n)以外的字符。Singleline可以使小数点可匹配包括(\n)在内的所有字符。

Multiline       默认情况下,"^"和"$"只匹配字符串的开始①和结尾④。如:

          ①xxx②\n

          ③xxx④

          Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使"$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global       主要在将表达式用来替换时起作用,Global表替换所有的匹配。

 

第四部分

1.如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站 DEELX 正则引擎的说明文档

 

2要求匹配的内容是整个字符串,而不是字符串中的一部分,那么可以在表达式的首尾使用"^"和"$",比如:"^\d+$"满足整个字符串只有数字的匹配。

 

3.要求匹配的内容是一个完整的单词,而不是单词中的一部分,那么表达式首尾可以使用"\b",比如:"\b(if|while\else\void\int......)\b"来匹配程序中的关键字。

 

4.表达式不要匹配空字符串,否则会一直匹配成功,而结果什么都没有匹配到。

 

5.能匹配空字符串的子匹配不要循环无限次。也不要括号内的子表达式可以匹配0次,而括号整体又可以匹配无限次,那就死循环了。

 

2010.12.23 10:22

posted @ 2010-12-22 18:07  天堂电影  阅读(451)  评论(0编辑  收藏  举报