当前位置:   article > 正文

js正则表达式_js 正则表达式匹配

js 正则表达式匹配

常用的正则匹配

密码

密码须包含大小写字母、数字、特殊字符(!@#$%^&*_-.·)三种且只能包含这三类且每种必须包含,长度为8-20个字符。

//(?=.*\d)表示密码中必须包含数字,(?=.*[a-z]),(?=.*[A-Z])和(?=.*[*!&$%^·_#.@-])同理
var reg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[*!&$%^·_#.@-])[\da-zA-Z*!&$%^·_#.@-]{8,20}$/
  • 1
  • 2

手机号

中国大陆手机号

// (13[0-9])匹配以13开头的手机号码,(14[5,7]),(15[0-3,5-9]),(17[0,3,5-8]),(18[0-9]),166,同理
var reg = /^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|(19[5,8,9]))\d{8}$/
  • 1
  • 2

邮箱

example@example.com:这是一个符合要求的电子邮件地址,它包含了本地部分example、域名部分example.com和顶级域名com

var reg = /^[a-z0-9A-Z]+([-|_|\\.]+[a-z0-9A-Z]+)*@([a-z0-9A-Z]+[-|\\.])+[a-zA-Z]{2,5}$/
  • 1

1. 正则表达式

1.1 正则表达式的定义

正则表达式:用来处理字符串匹配,它有一套单独的语法体系。

1.2 正则表达式的构建方式

  1. 使用一个正则表达式字面量,其由包含在斜杠之间的模式组成,如下所示:
var reg = /ab+c/
  • 1
脚本加载后,正则表达式字面量就会被编译。当正则表达式保持不变时,使用此方法可以获得更好的性能。
  • 1
  1. 调用RegExp对象的构造函数,如下所示。
var reg = new RegExp("ab+c")
  • 1
在脚本运行过程中,用构造函数创建的正则表达式会被编译。
如果正则表达式将会改变,或者它将会从用户输入等来源中动态的产生,就需要使用构造函数来创建正则表达式。
  • 1
  • 2

2. 正则表达式中的特殊字符

特殊字符(元字符):在正则当中有特殊语义的字符; \ ^ $ [] [^] {} ? * + . () |

2.1 特殊字符 \ 转义字符

在非特殊字符之前的反斜杠表示下一个字符是特殊字符,不能按照字面理解。
例如,前面没有"\""b"通常匹配小写字母"b",即字符会被作为字面理解,无论它出现在哪里。但如果前面加了"\",它将不在匹配任何字符,而是表示一个字符边界。

2.2 特殊字符^ 匹配输入的开始

如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
例如:/^A/并不会匹配 "an A"中的 'A',但是会匹配"An E"中的'A'

2.3 特殊字符$ 匹配输入的结束

如果多行标志被设置为true,那么也匹配换行符前的位置。
例如:/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'

2.4 特殊字符[]在固定范围内匹配一个字符,[^]范围取反

[0-9]可以简写为\d; [^0-9]可以简写为\D
[0-9A-Za-z]可以简写为\w; [^0-9A-Za-z]可以简写为\W
[\f\n\r\t...]可以简写为\s; [^\t\n\r\t...]可以简写为\S

2.5 特殊字符{} 匹配多个;修饰个数

字符含义
{n}n是个整数,匹配了前面一个字符刚好出现了n次 。
例如, /a{2}/ 不会匹配“candy”中的'a',但是会匹配“caandy”中所有的 a,以及“caaandy”中的前两个'a'
{n,}n 是一个正整数,匹配前一个字符至少出现了 n 次。
例如,/a{2,}/匹配"aa","aaa",和"aaaa"但是不匹配"a"
{n,m}n 和 m 都是整数,匹配前面的字符至少 n 次,最多 m 次。如果 n 或者 m 的值是 0,这个值被忽略。

2.6 特殊字符? 表示匹配前面的子表达式0次或者1次,等价于{0,1}

例如,/e?le?/匹配"angel"中的'el'"angle"中的'le'以及"oslo"中的'l'
如果?紧跟在任何量词*+?{}的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。
例如,对"123abc"使用/\d+/将会匹配"123",而使用/\d+?/则会匹配到"1"

2.7 特殊字符* 表示匹配前面的子表达式0次或者多次,等价于{0,}

例如,/bo*/会匹配"A ghost boooooed"中的"boooo""A bird warbled"中的'b',但是在"A goat grunted"中不会匹配任何内容。

2.8 特殊字符+ 表示匹配前面的子表达式1次或者多次,等价于{1,}

例如,/a+/会匹配"candy"中的'a'"caaaaaaaandy"中所有的'a',但是在"cndy"中不会匹配任何内容。

2.9 特殊字符. 默认匹配除换行符之外的任何单个字符

例如,/.n/将会匹配"nay, an apple is on the tree"中的'an''on',但是不会匹配'nay'
如果s ("dotAll")标志位被设为true,它会匹配换行符。

2.10 特殊字符()一个正则表达式模式使用括号,将导致相应的子匹配被记住

一个正则表达式模式使用括号,将导致相应的子匹配被记住。
例如,/a(b)c/可以匹配字符串"abc",并且记得"b”。
零宽:在匹配中,不占用字符,被称为零宽。
正向:字符串可以匹配pattern
负向:字符串可以匹配pattern
断言:表示一个匹配在某些条件下发生。
先行断言x(?=y):匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言。
后行断言(?<=y)x:匹配'x'仅当'x'前面是'y'.这种叫做后行断言。

运算符描述
(x)
捕获括号
(?:x)
非捕获括号
(?=pattern)
零宽正向先行断言
代表字符串中的一个位置,紧接该位置之后的字符序列够匹配 pattern
例如: 对于字符串 "a regular expression"re(?=gular) 只会匹配regular中的re,而不会匹配expression中的re
(?!pattern)
零宽负向先行断言
代表字符串中的一个位置,紧接该位置之后的字符序列不能够匹配 pattern
例如: 对于字符串 "a regular expression"re(?!gular) 只会匹配expression中的re,而不会匹配regular中的re
(?<=pattern)
零宽正向后行断言
代表字符串中的一个位置,紧接该位置之前的字符序列够匹配 pattern
例如: 对于字符串 "a regular expression"(?<=exp)re 只会匹配expression中的re,而不会匹配regular中的re
(?<!pattern)
零宽负向后行断言
代表字符串中的一个位置,紧接该位置之前的字符序列不能够匹配 pattern
例如: 对于字符串 "a regular expression"(?<!exp)re 只会匹配regular中的re,而不会匹配expression中的re

2.10.1 捕获括号

2.10.2 非捕获括号

匹配'x'但是不记住匹配项。这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。
表达式/foo{1,2}/{1,2}将只应用于'foo'的最后一个字符'o'
如果使用非捕获括号,则{1,2}会应用于整个'foo'单词。

2.10.3 先行断言x(?=y)

匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言。
例如,/Jack(?=Sprat)/会匹配到'Jack'仅当它后面跟着'Sprat'/Jack(?=Sprat|Frost)/匹配‘Jack’仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’‘Frost’都不是匹配结果的一部分。

2.10.4 后行断言(?<=y)x

匹配'x'仅当'x'前面是'y'.这种叫做后行断言。
例如,/(?<=Jack)Sprat/会匹配到' Sprat '仅仅当它前面是' Jack '/(?<=Jack|Tom)Sprat/匹配‘Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但是‘Jack’‘Tom’都不是匹配结果的一部分。

2.11 特殊字符|

选择或者关系字符,分支;自左向右匹配,一旦匹配上,就不在回头

3. 匹配模式

标志描述
g (global)全局搜索
i (ignore case)不区分大小写搜索
m (multipy)多行搜索
s允许.匹配换行符
u使用unicode码的模式进行匹配
y执行"粘性(sticky)"搜索,匹配从目标字符串的当前位置开始

4.元字符的优先级

运算符描述
\转义符
() []圆括号和方括号
* + ? {}限定符
^ $定位点
|替换,"或"操作

5.js正则表达式的方法(正则只有下面这两个方法)

5.1exec()方法

用于检索字符串中的正则表达式的匹配,如果字符串中有匹配的值返回该匹配值,否则为null。

//语法 RegExpObject.exec(string)
var str="Hello world!";
//查找"Hello"
var patt=/Hello/g;
var result=patt.exec(str); //返回值:Hello

//查找 "RUNOOB"
patt=/RUNOOB/g;
result=patt.exec(str);		//返回值:null
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5.2test()方法

用于检测一个字符串是否匹配某个模式,如果字符串中有匹配的值返回true,否则返回false。

//语法 RegExpObject.test(string)
var str="Hello world!";
//查找"Hello"
var patt=/Hello/g;
var result=patt.test(str); //返回值:true

//查找 "RUNOOB"
patt=/RUNOOB/g;
result=patt.test(str); //返回值:false	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6.使用字符串方法进行正则匹配

6.1match()方法

一个在字符串中执行查找匹配的 String 方法。
如果搜索值为字符串,则转换为正则表达式进行匹配。
如果匹配成功则返回包含匹配项的数组,否则返回null。

// 字符串匹配
let str = "test1test2";
str.match("test1")   //['test1']

// 使用正则表达式匹配
str.match(/t(e)(st(\d?))/)  //['test1', index:0, input:"test1test2"]

// 正则表达式匹配使用修饰符g
str.match(/t(e)(st(\d?))/g)  //['test1','test2']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

补充:当match()传入一个非全局的正则表达式时,实际上返回的数组里有两个属性:indexinput,他们分别表示匹配到的字符串的起始位置和检索的整个字符串。

let str = "test1test2".match(/t(e)(st(\d?))/)
str.index  //0
str.input  //test1test2
  • 1
  • 2
  • 3

6.2matchAll()方法

matchAll() 方法返回一个,包含所有匹配正则表达式的结果及分组捕获的迭代器。
正则表达式必须设置为全局模式,否则抛出异常。

let str = "test1test2";
let arr = [...str.matchAll(/t(e)(st(\d?))/g)]
arr[0]; //['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
arr[1]; //['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', length: 4]
  • 1
  • 2
  • 3
  • 4

6.3search()方法

一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,失败时返回-1。

let str = "javascript"
str.search(/script/) //4

str.search(/abc/)    //-1
  • 1
  • 2
  • 3
  • 4

6.4replace()方法

一个字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的字符串。

let str = "javascript"
//匹配成功,就会用第二个参数去替换匹配到的字符串,并返回替换后的整体字符串
str.replace(/java/, 'python') //pythonscript

//匹配不成功,返回原来的整体字符串
str.replace(/abc/, 'python') //javascript
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6.5 split()方法

一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的字符串存储到数组中。

let str = "1,2,3,4,5,6"
//根据字符串对字符串进行分割
str.split(',')	//['1','2','3','4','5','6']

//根据正则表达式对字符串进行分割(匹配上了)
//若匹配成功,最终返回一个数组,数组中的元素就是每个被分割的字符串
str.split(/,/)	// ['1','2','3','4','5','6']

//根据正则表达式对字符串进行分割(没有匹配上)
//若匹配失败,也会返回一个数组,数组中只有一个元素,那就是这个字符串整体
str.split(/\+/) //['1,2,3,4,5,6']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/781539
推荐阅读
相关标签
  

闽ICP备14008679号