补充:
2.正则表达式source
所有语言都通用:
PPT指代的规定:字符类、字符集合、边界、分组(匹配多个结果)、数量词
字符类
[直接量]
. (点号,小数点) 匹配任意单个字符,但是行结束符除外
\d 匹配任意阿拉伯数字。等价于[0-9]
\D 匹配任意一个不是阿拉伯数字的字符。等价于[^0-9]。
\w 匹配任意来自基本拉丁字母表中的字母数字字符,还包括下划线。等价于 [A-Za-z0-9_]。
\W 匹配任意不是基本拉丁字母表中单词(字母数字下划线)字符的字符。等价于 [^A-Za-z0-9_]。
\s 匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。
\S 匹配一个非空白符。
\t 匹配一个水平制表符(tab)
\r 匹配一个回车符(carriage return)
\n 匹配一个换行符(linefeed)
\v 匹配一个垂直制表符(vertical tab)
\f 匹配一个换页符(form-feed)
2.1.直接量字符
正则表达式中的所有字母和数字都是按照字面含义进行匹配的,Javascript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜线""作为前缀进行转义。
字符 匹配
字母和数字字符 自身
\o Null字符(\u0000)
\t 制表符(\u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
字符集合
[xyz] 一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符‘-’指定一个范围。[0-9] [a-z]
[^xyz] 一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 ‘-’ 指定一个范围内的字符。
边界
^ 匹配输入开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。
$ 匹配输入结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。
\b 匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。
\B 匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。
2.2.字符类
将直接量字符单独放进方括号内就组成了字符类,一个字符类可以匹配它所包含的任意字符。例如:/[abc]/ 就和字母"a"、“b”、“c"中的任意一个都匹配。”“符号用来定义否定字符类,例如:/[abc]/ 匹配的是"a”、“b”、"c"之外的所有字符。字符类可以使用连字符来表示字符范围,例如:/[a-z]/,要匹配拉丁字母表中任何字母和数字,[a-zA-Z0-9]
字符 匹配
[…] 方括号任意字符
[^…] 不在方括号内的任意字符
. 除换行符和其他unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于[A-Za-z0-9]
\W 任何不是ASCII字符组成的单词,等价于[^A-Za-z0-9]
\s 任何Unicode空白符
\S 任何非Unicode空白符的字符
\d 任何ASCII数字,等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量
例如:
[0-9] 匹配中括号中0~9之间任意一个字符 等价于 \d
[^0-9] 除了0~9之外的任意字符 等价 \D
1 使用数字作为一行的开始
[0-9]$ 使用数字作为一行的结尾
[a-z] 匹配中括号a~z之间任意一个字符
\w 基本字符[A-Za-z0-9_]
\W [^A-Za-z0-9_]
//vi example-location.js
// location ^$
var multistr = “abc345abc\nAbc456sdf\nas1111abc\nFFF222GGG”;
console.log(text);
// 查找出以三个字母开头的一句话
// var pattern = /2{3}\w*/mg;
// 查找以三个字母开头并且以三个小写字母结尾的一句话
//var pattern = /3{3}\w*[a-z]{3}KaTeX parse error: Undefined control sequence: \w at position 34: …= /1{3}\?w?*[a-z]{3}/mg;
//var pattern = /4{3}\w*[a-z]{3}$/m;
var result = null;
while(result=pattern.exec(multistr)){
console.log(result);
console.log(pattern.lastIndex);
if(!pattern.global){
break;
}
}
2.3.重复
数量词
x* 匹配前面的模式 x 0 或多次。
x+ 匹配前面的模式 x 1 或多次。等价于 {1,}。
x? 匹配前面的模式 x 0 或 1 次。
x{n} n 是一个正整数。前面的模式 x 连续出现 n 次时匹配
x{n,} n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配。
x{n,m} n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配。
x*? 像上面的 * 一样匹配前面的模式 x,然而匹配是最小可能匹配。
x+? 像上面的 + 一样匹配前面的模式 x,然而匹配是最小可能匹配。
x|y 匹配 x 或 y
重复方式
贪婪 匹配重复字符时是尽可能多的匹配,默认{1,4}
非贪婪 匹配重复字符时是尽可能少地匹配,在待匹配的字符数量词后跟随一个问号即可
例如: {1,4}?
/a+/ 可以匹配一个或者多个连续的字母a, 当使用“aaa”作为匹配字符串时正则表达式会匹配它的三个字符。
/a+?/ 可以匹配一个或者多个连续的字母a, 但是尽可能少地匹配。只能匹配第一个a
字符 含义
{n,m} 匹配前一项至少n次,但是不能超过m次
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n次
? 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
匹配前一项1次或者次,等价于{1,}匹配前一项0次或多次,等价于{0,}
描述某个规则的重复次数
/\d{2,4}/ //匹配2~4个数字
/\w{3}\d?/ //精确匹配三个单词和一个可选择的数字
/\s+javascript\s+/ //匹配前后带有一个或多个空格的字符串"javascript"
[a-z]+ : test.(“hello word” )=true test(“245 _355”).false
电话号码: 0351-1234567 [0-9]{4}-[0-9]{7} \d{4}-\d{7}
//vi example-exec.js
var line = “有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语全文翻译、网页翻译、文档翻译服务。”;
//查找“中文”字符串和“火星文”字符串
var pattern=/中文|火星文/img;
//var pattern=/全文|中文/img;
var result=null;
while(result=pattern.exec(line)){
console.log(result);
console.log(pattern.lastIndex);
}
//vi example-test.js
// 检测有没有大于8个字符的单词
// test()方法返回boolean类型,如果匹配上,则为true,否则为false
// 如果是全局匹配的话,会维护一个lastIndex属性,该属性是正则表达式对象的
var str = “He must be a person who is positive and brave enough to make short term sacrifice for long term success.The future has arrived,It commences now”;
console.log(text);
var pattern = /[a-z]{8,}/img;
var result = false;
while(result=pattern.test(str)){
console.log(result,pattern.lastIndex);
if(!pattern.global){
break;
}
}
//vi example-choose.js
var str = “He must java be a (person( who is java00 {positive( and javascript brave (enough{ to make short term javascript01 {sacrifice{ for long term success.The future has arrived,It commences now”;
console.log(str);
// 查找java00和javascript01,并且要00,01
var pattern = /java(script)?(\d{2})/img;
var result = null;
while(result=pattern.exec(str)){
console.log(result);
console.log(result[2]);
console.log(pattern.lastIndex);
}
// var pattern = /java|javascript/img;// 查找java或者javascript
// var pattern = /java(script)??/img;// 查找java 非贪婪匹配,尽可能少的匹配
// 查找被((或者{
{或者({或者{(包围的字符串
// var pattern = /[({]\w*[({]/img;
// 查找被((或者{
{包围的字符串
//var pattern = /(\w*(|{\w*{/img;
// var pattern = /([({])\w*\1/img;
?贪婪匹配
默认情况下,匹配重复字符是尽可能多匹配,而且允许后续的正则表达式继续匹配,称之为贪婪匹配。
?非贪婪匹配
在待匹配的字符后跟随一个问号即可 ,例如:"??"、"+?"、"?"、"{1,5}?"
P=\java(script)?\img 只查找的是java
2.4.选择、分组、引用
分组
(x) 匹配 x 并且捕获匹配项。 这被称为捕获括号(capturing parentheses)。
\n n 是一个正整数。一个反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串。
例如:/\w+://\w+(.)\w+\1\w+/
http://www.baidu.com
var str = “my website url is http://127.0.0.1:80/cms/index.html , my database url is jdbc:mysql://127.0.0.1:3306/cms , this is ok”
var pattern = /(http|jdbc:mysql|ftp)?/(((\d{1,3}).){3}((\d{1,3})))(?\d{2,4}))?(/[\w.])/i
?选择项
字符"|“用于分隔供选择的字符,选择项的尝试匹配次序是从左到右,知道发现了匹配项,如果左边的选择项匹配,就忽略右边的匹配项,即使它可以产生更好的匹配。
/ab|cd|ef/ 可以匹配字符串"ab"或者"cd"或者"ef”
圆括号作用有多个,一个作用是把单独的项组合成子表达式,一遍可以像处理一个独立的单元那样用"|"、"*"、"+"、"?“等来对单元内的项进行处理。
/java(script)?/ // 可以匹配字符串"java”,也可以匹配字符串"javascript"
?子表达式分组
在正则表达式中,圆括号的另一个作用是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分。
(/[a-z]+(\d+)/)
?引用
在正则表达式中,圆括号的再一个作用是允许在同一正则表达式的后部引用前面的子表达式。这是通过在字符"“后加一位或多位数字来实现的。例如”\1"引用的是第一个带圆括号的子表达式。
//vi example-getn.js
// 中括号中的值只有普通字符含义或者对特殊字符使用\进行转义
//(x)匹配 x 并且捕获匹配项
// \n n是一个正整数。一个反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串。
var line=“abc.efg+123.456++aaa.bbb++ccc.ddd+”;
var pattern=/(\w{3})[.]\w{3}+[+]/img;
while(result=pattern.exec(line)){
console.log(result);
console.log(result[1]);
console.log(pattern.lastIndex);
}
var pattern=/\w{3}([.])\w{3}([+])\2/img;
var result = null;
while(result=pattern.exec(line)){
console.log(result);
console.log(result[2]);
console.log(pattern.lastIndex);
}
A-Za-z ??