JavaScript正则表达式(JavaScript:The Definitive Guide笔记)

谁都会走 提交于 2019-12-05 12:53:32
//1.0 字符类
[...] 方括号内的任意字符
[^...] 不再方括号里面的任意字符
. 除换行符和其他Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9_]
\W 任何不适ASCII码字符组成的单词,等价于[^a-zA-Z0-9_]
\s 任何Unicode空白符
\S 任何非Unicode空白符
\d 任何ASCII数字,等价于[0-9]
\D 任何非Unicode数字,等价于[^0-9]
[\b] 退格直接量(特例)

方括号里面也可以有特殊的转义字符,例如[/\d\s/]匹配任意空白符或者数字

//1.1 重复
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项至少n次或者更多次
{n} 匹配前一项至少n次
? 匹配0次或者1次,等价于{0,1}
+ 匹配1次或者多次,等价于{1,}
* 匹配0次或者多次,等价于{0,}

//some examples:
/\d{2,5}/ //匹配2~5个数字
/\w{3}\d*/ //匹配单个单词和0个或多个数字
/\s+java\s+/ //匹配前后有一个或多个空格的java

//1.2 选择、分组和引用
字符"|"用于分隔供选择的字符,/android|iphone|ipod/可以匹配android,也可以匹配iphone或者ipod,匹配次序是从左至右的,
当左边的匹配后就会忽略右边的,所以说/a|abc/匹配"abc"时只能匹配a
正则表达式中,圆括号(())的作用有多种:
a:把单独的项组合成子表达式,例如:
/java(script)?/既可以匹配"java"也可以匹配"javascript"
/(aa|bb)+cc/可以匹配一个或多个"aa"或者"bb"与"cc"组成的字符串
b:在完整的模式中定义子模式
假定我们正在检索的模式是一个或多个小写字母后面跟了一个或多个数字,我们的正则可以这样写:/[a-z]+\d+/。
但是如果我们真正关心的是每个匹配尾部的数字,则可以将模式的数字部分放在"()"中,如:/[a-z]+(\d+)/
c:允许在同一正则表达式中引用前面的子表达式
通过在字符“\”后面家以为或多为数字来实现。这个数字指定了子表达式在正则表达式中的位置,他的位置是参与计数
的左括号的位置,例如,下面的正则表达式中,嵌套的子表达式([Ss]cript?)可以用\2来代替:
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/

对正则表达式前一个子表达式的引用,并不是指对子表达式模式的引用,而是与那个模式匹配的文本的引用。例如,下面
的正则用于匹配单引号或双引号之内的0个或多个字符,但它并不要求左右测的引号匹配:
/['"][^'"]*['"]/

如果要匹配左侧和右侧的引号匹配,则可以这样:
/(['"])[^'"]*\1/

如果不想创建分组的数字编码引用,则可以使用(?:)来分组:
/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/
这里"\2"引用了与(fun\w*)匹配的文本。

//1.3 制定位置匹配

边界:如果我们想匹配"javascript"这个单词,可以这样写/^javascript$/,但是我们想匹配一个字符串中的"javascript"这个单词的时候,就要用到
\b,它可以匹配一个单词的边界,即位于\w(ASCII单词)和\W(非ASCII单词)之间的边界:
/\bjavascript\b/ 可以匹配"i love javascript,and you ?",而不会匹配"i lovejavascript..."

断言:

零宽正想断言:
如果在符号"(?="和")"之间加入一个表达式,那么它就是一个断言,用来说明括号内的表达式必须正确的匹配。例如:
可以用/[Jj]ava([Ss]cript)?(?=\:)/来匹配"javascript: the definitive guide"中的javascript,而不能匹配"java in a nutshell"中的java。

零宽负向断言:
(?!p)表示将不匹配p,例如:
/Java(?!Script)([A-Z]\w*)/ 可以匹配Java,但不能匹配JavaScript

//1.4 修饰符
i:执行不区分大小写的匹配
g:执行一个全局的匹配,即找到所有的匹配为止,而不是找到第一个就停止
m:多行匹配模式,^匹配一行的开头和字符串的开头,$匹配一行的结尾和字符串的结尾 :/java$/im 将匹配"Java"和"java\nis fun"

//1.5 String方法

search(): "javascript".search(/script/i); //4; 
serach方法不支持全局检索

replace(): "java: hi,javascript".replace(/java/gi,"ruby"); //ruby: hi,rubyscirpt
正则中使用圆括号括起来的表达式是有从左到右的索引的,而且正则会记忆与每个子表达式匹配的文本。如果在替换的字符串中出现了$加数字,那么replace方法会用与指定的子表达式匹配的文本来替换这两个内容:
比如,可以用它将字符串总的英文引号替换为中文半角引号:
"hello,\"javascript\"...".replace(/"([^"]*)"/g,'“$1”'); //hello,“javascript”...

match(): 此方法返回的是由匹配结果组成的数组:
"1 plus 2 equals 3".match(/\d/g); //["1","2","3"]
"1 plus 2 equals 3".match(/\d/); //["1"]

如果match方法没有进行全局检索,match返回的数组的第一个元素是匹配的字符串,剩余的元素则是子表达式匹配的结果,这个功能很有用,例如,
采用下面的代码来解析URL:
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "my oschina blog: http://my.oschina.net/johny/blog";
var result = text.match(url);
result.forEach(function(str) {
	console.log(str);
});
/*
http://my.oschina.net/johny/blog
http
my.oschina.net
johny/blog
*/
split(): "1,2,3,4".split(","); //["1","2","3"]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!