正则表达式中js的常见应用

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
\uxxxxASCII 编码只能够匹配有限的单字节字符,使用 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) 匹配最后一个单词

  1. var r = /\w+$/;
  2. var a = s.match(r); //返回数组["you"]

2) 匹配第一个单词

  1. var r = /^\w+/;
  2. var a = s.match(r); //返回数组["how"]

3) 匹配每一个单词

  1. var r = /\w+/g;
  2. var a = s.match(r); //返回数组["how","are","you"]

 

 

 

 

 

正则表达式中 的$1,$2

$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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值