1. () [ ] : - / ,
注意:拿正则表达式跟字符串一个字符一个字符的比较
2. / 正则表达式的开始和结束字符。 \ 转义字符, 这两个字符要匹配都必须转义。
在正则表达式中:\ / 匹配 /
\ \ 匹配 \
在字符串中: / 代表 /
\\ 代表 \ ,转义字符需要转义,为什么在字符串中也要转义,
因为如果不转义,
如果紧挨着 \ 的是特殊意义字符或普通字符(但与该普通字符结合会形成新的特殊字符,如\t)的情况,那么 \ 将被当作转义字符使用。
如果紧挨着 \ 的是普通字符(结合也不是特殊字符的字符,如\m),那么 \ 将会被忽略。
(在正则表达式中同样)
不加^和$,只要字符串中有匹配的,不必完全匹配都会认为匹配成功。
特殊用处的字符:
^ $ . + { } [ ] ( ) / \ ? " ' w s d n t r - * = | u x < b : > f
转义字符有两种用途:1. 把特殊意义的字符转义成特殊意义字符本身。
2. 与普通字符结合,形成新的特殊字符,如:\t 制表符
匹配多种字符:
\d :匹配单个数字0-9
\w:匹配任意一个字母,数字或下划线 A-Z a-z 0-9 _
\s: 匹配空格,制表符,换页符等空白字符中的任意一个
. : 匹配除换行符(\n)以外的任何一个字符
自定义匹配多种字符:
[ ] :匹配其中任何一个。
如:[356] 匹配3或5或6。
[^345] 匹配除3,4,5以外的任何字符
[f-k] 匹配从f-k之间的字符
[f-k0-8] 匹配从f-k,0-8之间的字符
[^f-k0-8] 匹配从f-k,0-8之外的任何字符
匹配次数:
? : 0次或1次
+ : 至少1次,相当于{1,}
* : 可以不出现也可以出现任意次,相当于{0,}
{m} :重复出现m次,不能多也不能少。
{n,m}:至少出现n次,至多出现m次。
{n,}:至少出现n次。
或:
(dd|ff) 要么是dd,要么是ff。前后有其他表达式时,只有这两个匹配,并且匹配的结果将作为一个子匹配返回,如果不想要子匹配返回,则在前面加?:,如(?:dd|ff)
例如:abc(dd|ff)mno ,要么匹配abcddmno,要么匹配abcffmno
(dd)|(ff) 以 | 为分界,将表达式分成两个,要么匹配前一个,要么匹配后一个,加括号只是子匹配,并不是要么匹配dd,要么匹配ff。
例如:abc(dd)|(ff)opq 要么匹配abcdd,要么匹配ffopq
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
上述三种,其实就是用字符的不同表现进行匹配。 如:匹配W ,8进制 \127 (W), 16进制\x57(W) \u0057(W)
?=n 量词匹配任何其后紧接指定字符串 n 的字符串。
/is(?= all)/g
?!n 量词匹配其后没有紧接指定字符串 n 的任何字符串。
/is(?! all)/gi
;
m标志:
它声明了给定的正则表达式是否以多行模式执行模式匹配。
在这种模式中,如果要检索的字符串中含有换行符,^ 和 $ 锚除了匹配字符串的开头和结尾外还匹配每行的开头和结尾。
例如,模式 /W3School$/im 匹配 "w3school" 和 "W3School\nisgreat"。(\n 是换行符\u000A)
source 属性:
返回正则表达式文本,但文本中不包括正则表达式直接量使用的定界符,也不包括标志 g、i、m。
compile()方法。
compile() 方法用于在脚本执行过程中编译正则表达式。
compile() 方法也可用于改变和重新编译正则表达式。
patt=/man/g;
patt1=/(wo)?man/g;
patt.compile(patt1); // 把patt改变成patt1
exec() 方法用于检索字符串中的正则表达式的匹配。
返回一个数组,如果未找到匹配,则返回值为 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。
数组还带有两个属性:index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。
非全局模式:string 的match方法和exec()返回的结果一样。
全局模式:
当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。
这就是说,我们可以通过反复调用 exec() 方法(返回的结果和非全局模式一样,都是数组,非全局模式就相当于全局模式只调用一次)来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
重要事项:如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。
var reg1 = /all/g;
var str1 = "my all is hah all dd";
var res = reg1.exec(str1);
alert(res);
reg1.lastIndex = 0; // 如果不置为0,则下面的字符串匹配不到all
var str2 = "m all hs dd";
var res2 = reg1.exec(str2);
alert(res2);
贪婪、惰性 和 支配性 (目前IE.Opera不支持)的量词 ☆
贪婪量词: 先看整个的字符串是否匹配.如果没有发现匹配的,它去掉该字符串的最后一个字符,并再次尝试。如果还没有发现匹配,那么再次去掉最后一个字符
这个过程一直重复直到发现一个匹配或者字符串不剩任何字符。
惰性量词: 先看字符串的第一个字母是否匹配。如果单独这一个字符还不够,就读入下一个字符, 组成两个字符的字符串.如果还没有匹配,惰性量词将继续从
字符串中添加字符直到发现匹配或整个字符串都检查过也没有匹配。刚好与贪婪量词相反。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步的尝试。支配量词就是一刀切,
贪婪: ? * +
惰性: ?? *? +?
支配: ?+ *+ ++
var str = "X98Y87Z65";
var reg = /\d+/g;
var ress = reg.exec(str); // 此处使用exec()等其他正则表达式的匹配方法也可,下同
ress = reg.exec(str); // 虽然是全局匹配,但返回的结果是第一个匹配的子串!因为全局匹配是为循环调用exec()准备的。
document.writeln(RegExp.lastMatch); // 87
document.writeln(RegExp.leftContext); // X98Y
document.writeln(RegExp.rightContext ); // Z65
document.writeln(RegExp.lastMatch ); // Z65
str = '<a href="http://www.365mini.com/" title="首页" target="_blank">CodePlayer</a>';
reg = /href="[^">]+"/; // 注:是出"和>之外的字符,不是以"开头!!!
reg.exec(str);
document.writeln(RegExp['$&']); // href="http://www.365mini.com/"
属性 | 描述 |
---|---|
$1...$9 | 全局属性返回最近一次正则表达式搜索中某个子表达式匹配的文本。 |
input($_) | 全局属性返回最近一次正则表达式搜索中用于执行搜索的整个字符串(待匹配的字符串)。 |
lastMatch($&) | 全局属性返回最近一次正则表达式搜索中最后一个匹配的文本。 |
lastParen($+) | 全局属性返回最近一次正则表达式搜索中最后一个子表达式匹配的文本。 |
leftContext($`) | 全局属性返回最近一次正则表达式搜索中被搜索字符串中最后一个匹配之前的字符串。 |
rightContext($') | 全局属性返回最近一次正则表达式搜索中被搜索字符串中最后一个匹配之后的字符串。 |
global | 指示正则表达式是否具有global标志(g) |
ignoreCase | 指示正则表达式是否具有ignoreCase标志(i) |
multiline | 指示正则表达式是否具有multiline标志(m) |
source | 返回正则表达式模式的文本内容(不包括标志) |
?: // 空匹配 ??? = new RegExp(""); 但必须加括号,不能 /?:/ 这样直接使用。
(?=)会作为匹配校验,但不会出现在匹配结果字符串里面
(?:)会作为匹配校验,并出现在匹配结果字符里面,它跟(...)不同的地方在于,不作为子匹配返回。