1、正则表达式中一些特殊字符的含义
. 任意一个字符,包括汉字(不包括换行)
var reg = /.at/g;
var text = "你at,bat,cat,ddat";
println(text.match(reg));//你at,bat,cat,dat
\w 任意一个字母、数字、下划线
var reg = /\wat/g;
var text = "你at,bat,cat,ddat";
println(text.match(reg));//bat,cat,dat
\d 任意一下数字
var reg = /\dat/g;
var text = "0at,bat,cat,3at";
println(text.match(reg));//0at,3at
\s 匹配空白字符
\W(大写) 除了字母、数字、下划线之外的任意字符,包括汉字
var reg = /\Wat/g;
var text = "&&at,你at,!!at,¥at,cat";
println(text.match(reg));//&at,你at,!at,¥at
\D(大写) 除了数字任意字符,包括汉字
var reg = /\Dat/g;
var text = "你at,0at,cat";
println(text.match(reg));//你at,cat
\uxxxx 匹配Unicode字符
var reg = /\u90b1at/g; //\u90b1-->邱
var text = "邱at,他at,0at,cat";
println(text.match(reg));//邱at
[] 括号内的任意字符
[^] 除了括号内的任意字符
[\u4e00-\u9fa5] 匹配汉字
var reg = /[\u4e00-\u9fa5]/g;
var text = "邱at,他at,0at,cat";
println(text.match(reg));//邱,他
[^\x00-\xff] 匹配双字节字符(也就是除了ascii码以外的字符)
var reg = /[^\x00-\xff]/g;
var text = "邱at,他at,0at,cat,¥……";
println(text.match(reg));//邱,他,,,¥,…,…
{n,m} 至少n次,最多m次(包括n,m在内)
{n,} 至少n次
{n} 恰好n次
* 0次或多次
+ 至少一次
? 0次或者1次 (也就是说此项可选)
var reg = /a*/g;
var text = "bbbb";
println(reg.test(text));//true 因为bbbb含有0个a
| 或
() 组合,后面可以跟*,+,?,|等符号(将括号内的部分看成一个整体)
var reg = /ab|cd/g;
var text = "ab,cd,dd";
println(text.match(reg));//ab,cd
var reg = /java(script)?/g;
var text = "javascript,java,#c";
println(text.match(reg));javascript,java
^ 从第一个字符开始匹配
$ 从最后一个字符开始匹配
\b 匹配单词边界
\B 不是单词边界
(?=exp)
(?!exp)
var reg = /java(?=S)/;//只能当java后面的字母为S时,才匹配前面的表达式
var text1 = "javaScript";
var text2 = "javaCoffee";
println(text1.match(reg));//java 注意返回的匹配字符中不包含S
println(text2.match(reg));//null
var reg = /java(?!Script)/;//只能当java后面不是Script时,才匹配前面的表达式
var text1 = "javaScript";
var text2 = "javaCoffee";
println(text1.match(reg));//null
println(text2.match(reg));//java
trim方法的实现
function trim(str){
return str.replace(/^\s+|\s+$/g,'');
}
//即匹配某个单词
var reg = /\b[Jj]ava\b/g;
var text = "javascript Java Javascript java";
println(text.match(reg));//Java,java
var reg = /\B[Ss]cript/;
println(reg.test("Script")); //false
println(reg.test("JavaScript")); //true
println(reg.test(" Script")); //false
println(reg.test("Scripting")); //false
2、String支持RegExp的方法
如果RegExp分组中包含分组(即用括号括起来的表达式),如下面的的例子
那么数组中的第一个元素matches[0]是匹配的表达式,
余下的元素是分组中的子表达式对应的匹配元素,matches[1]是第一个括号表达式 对应的匹配项,
对于这些匹配,我们也可以通过RegExp.$1变量来得到,等价于matches[1],两者是对应的;
var url = /(\w+):\/\/(.+)\/(.+)/;
var text = "http://www.baidu.com/index.html";
var matches = text.match(url);
println(matches[0]);//http://www.baidu.com/index.html
println(matches[1]);//http
println(matches[2]);//www.baidu.com
println(matches[3]);//index.html
在replace方法中,$1也可以这样用
var quote = /'(.*?)'/g;
var text = "'te''xt'";//'te''xt'
println(text.replace(quote,'($1)'));//(te)(xt) 将''替换为()
\m模式匹配
一下代码中的正则表达式想要匹配行末的一个单词.它只会匹配最后的Sixth,
但实际上这个字符串包含两个换行符,因此, Second, Fourth也应该匹配出来
因此引入了多行模式,这会让$边界匹配换行符(\n) 和字符串真正的结尾
var text = "First Second\nThird Fourth\nFifth Sixth";
var reg = /(\w+)$/g;
println(text.match(reg));//Sixth
var text = "First Second\nThird Fourth\nFifth Sixth";
var reg = /(\w+)$/gm;
println(text.match(reg));//Second,Fourth,Sixth
贪婪匹配与惰性匹配
贪婪 先看整个字符串是否匹配,如果没有发现匹配,它去掉该字符串中最后一个字符,并再次尝试.重复这个过程直到发现匹配 或者字符串不剩任何字符.
惰性 先看字符串中第一个字符是否匹配.如果单独这个字符还不够,就读入下一个字符,组成两个字符的字符串.
如果还是没有发现匹配,惰性量词继续从字符串中添加字符直到发现匹配或者整个字符串都检查过也没有匹配.
贪婪 惰性 描述
? ?? 零次或一次出现
* *? 零次或多次出现
+ +? 一次或多次出现
{n} {n}? 恰好n次出现
{n,m} {n,m}? 至少n次之多m次出现
{n,} {n,}? 至少n次出现
贪婪匹配,匹配尽量多的字符
var reg = /\(.*\)/g;
var text = "(html)(html)";
println(text.match(reg));//(html)(html)
惰性,匹配尽量小的字符
var reg = /\(.*?\)/;
var text = "(html)(html)";
println(text.match(reg));//(html)
将双引号替换为''
var name = '"a", "b"';
println(name.replace(/"([^"]*)"/g, "'$1'")); //'a','b';
PS:附件中的内容为本文的txt文件