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

/*
	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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值