javascript的正则表达式用法:http://www.runoob.com/js/js-regexp.html
参考js正则表达式大全:http://c.biancheng.net/view/5632.html
https://www.runoob.com/regexp/regexp-metachar.html
js正则表达式的常见用法
1。/pattern/是正则表达式的界定符,里面的内容(pattern)是要匹配的内容,就是本例中的/\//; 2。\是转义的意思,\/代表的是/字符。 3。JavaScript中应该是字符串的replace() 方法如果直接用str.replace(/\//, '')只会替换第一个匹配的字符. 而str.replace(/\//g, '')则可以替换掉全部匹配的字符(g为全局标志)。
语法
/正则表达式主体/修饰符(可选,修饰符都为小写)
正则表达式修饰符
修饰符 描述 i 执行对大小写不敏感的匹配。 g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 gi 匹配所有可能的字串及忽略大小写。
对于js而言,没有replaceAll方法,因此需要使用修饰符加以修饰。
[a-z] 可以用来匹配任意位置上的小写字母: "...a..." ^[a-z] 只能匹配以小写字母为行首的行: "a..." [a-z]$ 只能匹配以小写字母为行尾的行: "...a" ^[a-z]$ 应该只能匹配只有一个小写字母的行: "a"
如下所示:匹配a1234A, 都是True. 但匹配以下例子, 第一个是False, 第二个是True ABCa1234A a1234Aabc ABCa1234Aabc
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试用例</title> </head> <body>
<script> var regex1 = /(^[a-z]+)([0-9]+)([A-Z]+$)/; var regex2 = /([a-z]+)([0-9]+)([A-Z]+)/; document.writeln(regex1.test("ABCa1234Aabc")); document.writeln(regex2.test("ABCa1234Aabc")); </script>
</body> </html>
正则表达式模式 元字符是拥有特殊含义的字符:
元字符 描述 . 查找单个字符,除了换行和行结束符, 这个符号意味着可以匹配任意一个字符。如下所示的正则表达式:/c.t/
意味着匹配“以c开头,之后是任意一个字符,紧跟着是字母t”的字符串。
对于[.]和\.来说,这个符号还是表示自身
\w 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_]
,如[\w]匹配"$5.98"中的5 \W 匹配一个非单字字符。等价于 [^A-Za-z0-9_]
,如[\W]匹配"$5.98"中的$。 \d 查找数字 \D 查找非数字字符 \s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \b 匹配单词边界 \B 匹配非单词边界 \0 查找 NUL字符 \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 \ddd 查找以八进制数 xxxx 规定的字符,比如var r = /\141/;表示匹配“a”,字母 a 的 ASCII 编码为 97,被转换为八进制数值后为 61,使用十六进制需要添加“\x”前缀,主要是为了避免语义混淆,而八进制则不需要添加前缀。97 / 8=12...1 12 / 8 =1...4 1 / 8 = 0...1 所以,97=(141)8 \xdd 查找以十六进制数 dd 规定的字符,比如var r = /\x61/;表示匹配“a”,字母 a 的 ASCII 编码为 97,被转换为十六进制数值后为 61 \uxxxx ASCII 编码只能够匹配有限的单字节字符,使用 Unicode 编码可以表示双字节字符。Unicode 编码方式:“\u”前缀加上 4 位十六进制值。查找以十六进制 xxxx规定的 Unicode 字符,用法,var r = "/\u0061/";在 RegExp() 构造函数中使用元字符时,应使用双斜杠,var r = new RegExp("\\u0061");RegExp() 构造函数的参数只接受字符串,而不是字符模式。在字符串中,任何字符加反斜杠还表示字符本身,如字符串“\u”就被解释为 u 本身,所以对于“\u0061”字符串来说,在转换为字符模式时,就被解释为“u0061”,而不是“\u0061”,此时反斜杠就失去转义功能。解决方法:在字符 u 前面加双反斜杠。
量词:
量词 描述 n+ 匹配任何包含至少一个 n 的字符串,1到多={1,} n* 匹配任何包含零个或多个 n 的字符串,0到多={0,} n? 匹配任何包含零个或一个 n 的字符串,0到1={0,1} n{x} 匹配包含 x 个 n 的序列的字符串,x个 n{x,y} 匹配包含最少 x 个、最多 y 个 n 的序列的字符串,x-y n{x,} 匹配包含至少 x 个 n 的序列的字符串,x到多
惰性匹配 重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符。
?、{n} 和 {n,m} 重复类具有弱贪婪性,表现为贪婪的有限性。 *、+ 和 {n,} 重复类具有强贪婪性,表现为贪婪的无限性。
量词 描述 {n,m}? 尽量匹配 n 次,但是为了满足限定条件也可能最多重复 m 次。 {n}? 尽量匹配 n 次。 {n,}? 尽量匹配 n 次,但是为了满足限定条件也可能匹配任意次。 ?? 尽量匹配,但是为了满足限定条件也可能最多匹配 1 次,相当于 {0,1}?。 +? 尽量匹配 1 次,但是为了满足限定条件也可能匹配任意次,相当于 {1,}?。 *? 尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于 {0,}?。
注意事项:尽量匹配,也是最少匹配的意思。
var r = /<.*?>/
在上面示例中,对于正则表达式 /<.*?>/ 来说,它可以返回匹配字符串 "<>",但是为了能够确保匹配条件成立,在执行中还是匹配了带有 4 个字符的字符串“html”。惰性取值不能够以违反模式限定的条件而返回,除非没有找到符合条件的字符串,否则必须满足它。
方括号用于查找某个范围内的字符:
表达式 描述 [abc] 查找方括号之间的任何字符 。 [^abc] 查找不在方括号内的字符。var r = /[^0123456789]/g; [0-9] 查找从 0 至 9 范围内的数字,即查找数字。 [a-z] 查找从小写 a 到小写 z 范围内的字符,即查找小写字母。 [A-Z] 查找从大写 A 到大写 Z 范围内的字符,即查找大写字母。 [A-z] 查找从大写 A 到小写 z 范围内的字符,即所有大小写的字母。 (x|y) 查找任何以 | 分隔的选项。匹配任意数字或字母var r = /\w+|\d+/;可以定义多重选择模式。设计方法:在多个子模式之间加入选择操作符var r = /(abc)|(efg)|(123)|(456)/;为了避免歧义,应该为选择操作的多个子模式加上小括号。 (?:x)
匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号 ,使得你能够定义与正则表达式运算符一起使用的子表达式。看看这个例子 /(?:foo){1,2}/
。如果表达式是 /foo{1,2}/
,{1,2}
将只应用于 'foo' 的最后一个字符 'o'。如果使用非捕获括号,则 {1,2}
会应用于整个 'foo' 单词。 x(?=y)
匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言。
例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
(?<=y)
x 匹配'x'仅仅当'x'前面是'y'.这种叫做后行断言。
例如,/(?<=Jack)Sprat/会匹配到' Sprat '仅仅当它前面是' Jack '。/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但是‘Jack’和‘Tom’都不是匹配结果的一部分。
x(?!y)
仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找。
例如,仅仅当这个数字后面没有跟小数点的时候,/\d+(?!\.)/ 匹配一个数字。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’而不是‘3.141’
(?<!y )x
仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找。
例如, 仅仅当这个数字前面没有负号的时候,/(?<!-)\d+/
匹配一个数字。/(?<!-)\d+/.exec('3')
匹配到 "3"./(?<!-)\d+/.exec('-3')
因为这个数字前有负号,所以没有匹配到。
注意事项:在正则表达式语法中,放括号表示字符范围。在方括号中可以包含多个字符,表示匹配其中任意一个字符。如果多个字符的编码顺序是连续的,可以仅指定开头和结尾字符,省略中间字符,仅使用连字符-
表示。如果在方括号内添加脱字符^
前缀,还可以表示范围之外的字符。[ab$]中把$作为了一个正常的的字符串来处理而不是匹配结尾的含义。这句的意义是任意匹配a/b/$来处理了。[ab^]同理也是把^作为一个正常的字符串处理。
[12]表示1或者2 不过[0-9]这样的表示0到9 [a-z]表示a到z 例如:匹配从18到65年龄段所有的人 var reg = /[18-65]/; // 这样写对么 reg.test('50') //Uncaught SyntaxError: Invalid regular expression: /[18-65]/: Range out of order in character class //聪明的你想可能是8-6这里不对,于是改成[16-85]似乎可以匹配16到85的年龄段的,但实际上发现这也是不靠谱的
实际上我们匹配这个18-65年龄段的正则我们要拆开来匹配 我们拆成3部分来匹配 18-19 20-59 60-65 reg = /(18|19)|([2-5]\d)|(6[0-5])/;
边界量词 边界就是确定匹配模式的位置,如字符串的头部或尾部,具体说明如表所示。
JavaScript 正则表达式支持的边界量词
量词 说明 ^ 匹配开头,在多行检测中,会匹配一行的开头, ^once,这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。
$ 匹配结尾,在多行检测中,会匹配一行的结尾, bucket$,这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符 ^ 和 $ 同时使用时,表示精确匹配(字符串与模式一样)。例如:^bucket$,只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配
注意事项:由于[abc]中包含任意字符,所以^ $也在里面包含,除非写成[^abc],这一种情况要除外。
下面代码演示如何使用边界量词。先定义字符串:
var s = "how are you"
1) 匹配最后一个单词
var r = /\w+$/; var a = s.match(r); //返回数组["you"] 2) 匹配第一个单词
var r = /^\w+/; var a = s.match(r); //返回数组["how"] 3) 匹配每一个单词
var r = /\w+/g; var a = s.match(r); //返回数组["how","are","you"]
$1,$2表达的是小括号里面的内容
$1是第一个小括号里的内容,$2是第二个小括号里面的内容,依此类推
比如(\\d{4})(\\d{2})(\\d{2}) 匹配"20190919"
/$1是第一个括号里匹配的2019
$2是第二个括号里匹配的09
$3是第三个括号里匹配的19
用法如下所示:var txt = str.replace(/(\d+)\.(\d{4}).*$/,"$1.$2");这段代码的含义是只保留小数点后4为小数。
使用正则表达式的方法
方法 描述 exec
该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
/e/.exec("The best things in life are free!");
字符串中含有 "e",所以该实例输出为:
e
test
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
var patt = /e/;patt.test("The best things in life are free!");
字符串中含有 "e",所以该实例输出为:
true
match
一个在字符串中执行查找匹配的String方法,它返回一个数组,在未匹配到时会返回 null。
var str = '1223334444'; var reg = /\d{2}/g; var res = str.match(reg); console.log(res) //["12", "23", "33", "44", "44"]
matchAll
一个在字符串中执行查找所有匹配的String方法,它返回一个迭代器(iterator)。 search
一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。
(1)、使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:var str = "Visit Runoob!"; var n = str.search(/Runoob/i);
(2)、检索字符串中 "Runoob" 的子串:var str = "Visit Runoob!"; var n = str.search("Runoob");
输出结果为:
6
replace
一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
(1)、使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :var str = "Visit Microsoft!"; var txt = str.replace(/microsoft/i,"Runoob");
(2)、replace() 方法将接收字符串作为参数:var str = "Visit Microsoft!"; var txt = str.replace("Microsoft","Runoob");
结果输出为:
Visit Runoob!
split
一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的 String
方法。
var reg = /pattern/flags // 字面量创建方式 pattern:正则表达式 flags:标识(修饰符) var reg = new RegExp(pattern,flags); //实例创建方式
正则表达式思维导图:https://www.cnblogs.com/lnlvinso/p/10467941.html