您的位置:首页 > Web前端 > JavaScript

《JavaScript语言精粹》--第7章:正则表达式

2013-06-18 22:19 211 查看
/*
JS中的正则表达式
JS中,正则表达式必须写在一行中
两种创建正则表达式的方式:
使用"/regex/"来创建正则表达式字面量,这也是不建议使用块状注释的原因
使用new RegExp("regex","gmi")方法创建正则表达式对象
优先考虑使用字面量
字面量更加直观
使用new RegExp来创建需要进行字符转义
*/
/*正则表达式字面量创建*/
console.log(/^(\w+)@(\w+)\.(\w+)(\.\w+)?$/.exec("wly12345@sina.com"));
//输出:
//["wly12345@sina.com", "wly12345", "sina", "com", undefined, index: 0, input: "wly12345@sina.com"]

/*正则表达式对象的创建*/
console.log(new RegExp("^(\\w+)@(\\w+)\\.(\\w+)(\\.\\w+)?$").exec("wly12345@sina.com"));
//输出
//["wly12345@sina.com", "wly12345", "sina", "com", undefined, index: 0, input: "wly12345@sina.com"]

/*
正则表达式语法
匹配开始和结束:
^表示此字符串开始
$表示此字符串结束
分组
(...)表示捕获型分组,一个捕获型分组会复制它所匹配的文本放入result数组中
(?:...)表示一个非捕获型分组,仅作简单匹配,不会捕获匹配的分组
(?=...)向前正向匹配,类似于非捕获型分组,但在这个组匹配之后,文本会倒回到它开始的地方,实际上并不匹配任何东西,不是一个好的特性
(?!...)向前负向匹配,类似于向前正向匹配,只有当它匹配失败时才继续向前进行匹配,不是一个好的特性
量词
{a,b} a~b次
{a,} 至少a次
?表示重复0次或1次 {0,1}
*表示任意次数 {0,}
+表示至少一次 {1,}
如果一个量词表示贪婪型匹配
如果一个量词附加一个?后缀,表示非贪婪匹配
模式
g全局,匹配多次
i大小写敏感
m多行
转义
\f 换页符
\n 换行符
\r 回车
\t 制表符
\u Unicode表示一个十六进制常量
\d [0-9]
\D [^0-9]
\s [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029] Unicode空白的不完全子集
\S 与\s相反
\b 子边界标识,不是一个好特性
\1 分组1所捕获到的文本的一个引用 \2 \3类推
\w [0-9A-Z_a-z]
\W 与\w相反
[A-Za-z\u00C0-\u1FFF\u2800-\uFFFD] 包括所有Unicode字母

RegExp对象的属性
global : g被使用,则为true
ignoreCase : i被使用,则为true
lastIndex : 下一次exec匹配开始的索引,初始值为0
multiline : m被使用,则为true
source : 正则表达式的源码文本
*/

/*非捕获型分组*/
console.log(/^(\w+)@(\w+)\.(?:\w+)(\.\w+)?$/.exec("wly12345@sina.com"));
//输出:
//["wly12345@sina.com", "wly12345", "sina", undefined, index: 0, input: "wly12345@sina.com"]
//分析:
//第三个分组为非捕获型,所以没有存入result中

/*向前正向匹配*/
console.log(/^(\w+)@(\w+)(?=\.\w+)\.(\w+)$/.exec("wly12345@sina.com"));
//输出:
//["wly12345@sina.com", "wly12345", "sina", "com", index: 0, input: "wly12345@sina.com"]
//分析:
//第三个分组为向前正向捕获,所以没有存入result中,会回到原来位置,所以第四个分组也会被捕获到,为com

/*向前负向匹配*/
console.log(/^(\w+)@(\w+)(?!\.\w+)\.(\w+)$/.exec("wly12345@sina.com"));
//输出:
//null
//分析:
//第三个分组为向前负向捕获,不匹配,所以没有结果,为null

/*贪婪型匹配*/
console.log(/(a+)/.exec("aaaaa"));
//输出:
//["aaaaa", "aaaaa", index: 0, input: "aaaaa"]
//分析:
//贪婪匹配了所有的a

/*非贪婪型匹配*/
console.log(/(a+?)/.exec("aaaaa"));
//输出:
//["a", "a", index: 0, input: "aaaaa"]
//分析:
//非贪婪匹配,只匹配了一个a

/*全局匹配*/
console.log("aab+ccc.ddd{asdf".replace(/(\w+)/g,"word"));
console.log("aab+ccc.ddd{asdf".replace(/(\w+)/,"word"));
//输出:
// word+word.word{word
// word+ccc.ddd{asdf
//分析:
// 第一个匹配全局,所以所有的字母串都被替换成了word
// 第二个匹配第一个,所以甚至有aab被替换成了word

/*多行匹配*/
console.log("aab\nbbc\nccd".match(/^(\w+)$/gm));
console.log("aab\nbbc\nccd".match(/^(\w+)$/g));
//输出:
// ["aab", "bbc", "ccd"]
// null
//分析:
// 第一行,使用全局和多行匹配模式,可以匹配每一行
// 第二行,仅仅使用全局匹配模式,由于正则表达式中规定必须全部为字母或数字,所以不匹配,结果为null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐