JS 正则表达式

时间:2022-07-26 19:47:23

js 正则表达式

1、正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。

表达式: var expression=/pattern/flags;

 

其中模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可以带有一或多个标志(flags),用以标明正则表达式的行为。

3个(flags)标志:

g:全局模式,被应用于所有字符串,而非在发现第一个匹配项时立即停止。

i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;

m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在模式匹配的选项。

 

因此,简单的说,一个正则表达式就是一个模式(pattern)与上述3个标志(flags)的组合体。

2、和其他语言的正则表达式类似,模式中使用的所有元字符都必须转义。

正则表达式中的元字符包括:( [ { \ ^ $ | ) ? * + . ] }

 

例:

匹配字符串中所有“.at”,不区分大小写:

var pattern=/\.at/gi;

匹配第一个“[bc]at”,不区分大小写:

var pattern=/\[bc\]at/i;

 

以上是使用字面量形式来定义的正则表达式。还有一种使用RegExg构造函数的方式。它接收两个参数:一个是要匹配的字符串模式,一个是可选的标志字符串。

如:

var pattern=/[bc]at/i; //匹配第一个“bat”或“cat”,不区分大小写

var pattern1=new RegExp("[bc]at","i"); //与字面量等价

 

3、由于RegExp函数模式参数都是字符串,所以在某些情况下要对字符串进行双重转义。 所有元字符必须进行双重转义,已经转义过的字符也是如此。

字面量模式                等价的字符串

/\[bc\]at/     "\\[bc\\]at"

/\.at/          "\\.at"

/name\/age/       "name\\/age"

/\d.\d{1,2}/       "\\d.\\d{1,2}"

/\w\\hello\\123/     "\\w\\\\hello\\\\123"

 

4、 RegExg构造函数 的实例方法

1)exec() 方法是一个正则表达式方法。

exec() 方法用于检索字符串中的正则表达式的匹配。

该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

以下实例用于搜索字符串中的字母 "e":

Example 1

/e/.exec("The best things in life are free!");

 

2)test() 方法是一个正则表达式方法。

test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

var patt = /e/;

patt.test(
"The best things in life are free!");

 

5、使用字符串方法

JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。

search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

实例1:

使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:

var str = "Visit Runoob!";

var n = str.search(/Runoob/i);//输出6

 

实例2:

使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :

var str = document.getElementById("demo").innerHTML;

var txt = str.replace(/microsoft/i,"Runoob");//输出为:Visit Runoob!

 

6、正则表达式模式

方括号用于查找某个范围内的字符:

表达式 描述

[abc]          查找方括号之间的任何字符。

[
^abc]       查找任何不在方括号之间的字符。

[
0-9]        查找任何从 0 至 9 的数字。

[a
-z]        查找任何从小写 a 到小写 z 的字符。
  
[A
-Z]        查找任何从大写 A 到大写 Z 的字符。

[A
-z]        查找任何从大写 A 到小写 z 的字符。

[adgk]       查找给定集合内的任何字符。
  
[
^adgk]       查找给定集合外的任何字符。

(red
|blue|green) 查找任何指定的选项。

元字符

元字符(Metacharacter)是拥有特殊含义的字符:

元字符 描述

^:匹配字符串的开始位置

$:匹配字符串的结束位置

*:匹配前面子表达式任意次数

+:匹配前面子表达式一次或多次

?:匹配前面子表达式0次或多次

{n}:n为非负整数,匹配确定的n次。例如:“o{
2}”不能匹配‘bod’中的‘o’ ,但能匹配‘food’中的‘0

{n,}:至少匹配n次

{n,m}:最少匹配n次,最多匹配m次

x
|y:匹配x或y

[xyz]:字符集合。匹配任意一个字符。例如‘[abc]’ 匹配 ‘plain’ 中的 ‘a’

[
^xyz]:匹配未包含的任意字符。例如‘[^abc]’ 匹配 ‘plain’ 中的 ‘plin’



. 查找单个字符,除了换行和行结束符。

\w 查找单词字符。

\W 查找非单词字符。

\d 查找数字。

\D 查找非数字字符。

\s 查找空白字符。

\S 查找非空白字符。

\b 匹配单词边界。

\B 匹配非单词边界。

\
0 查找 NULL 字符。

\n 查找换行符。

\f 查找换页符。

\r 查找回车符。

\t 查找制表符。

\v 查找垂直制表符。

\xxx 查找以八进制数 xxx 规定的字符。

\xdd 查找以十六进制数 dd 规定的字符。

\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

量词

量词 描述

n
+

匹配任何包含至少一个 n 的字符串。

例如,
/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"

n
*

匹配任何包含零个或多个 n 的字符串。

例如,
/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"

n
?

匹配任何包含零个或一个 n 的字符串。

例如,
/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"

n{X}

匹配包含 X 个 n 的序列的字符串。

例如,
/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"

n{X,}

X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。

例如,
/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"

n{X,Y}

X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。

例如,
/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的两个 "a",匹配 "caaaaaaandy" 中的前面三个 "a"。注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的 "a",匹配项也是 "aaa"

n{X,} 匹配包含至少 X 个 n 的序列的字符串。

n$ 匹配任何结尾为 n 的字符串。

^n 匹配任何开头为 n 的字符串。

?=n 匹配任何其后紧接指定字符串 n 的字符串。

?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

7、RegExp构造函数属性

$_ 最近一次要匹配的字符串

$
& 最近一次的匹配项

$
+ 最近一次要匹配的捕获组

$` $_字符串中$
+之前的文本

$
* 布尔值,表示是否所有表达式都使用多行模式。

$
' $_字符串中$+之后的文本

 

正则表达式表单验证实例:

/*是否带有小数*/function    isDecimal(strValue )  {  

var objRegExp= /^\d+\.\d+$/;

return objRegExp.test(strValue); }

/*校验是否中文名称组成 */function ischina(str) {

var reg=/^[\u4E00-\u9FA5]{2,4}$/; /*定义验证表达式*/

return reg.test(str); /*进行验证*/}

/*校验是否全由8位数字组成 */function isStudentNo(str) {

var reg=/^[0-9]{8}$/; /*定义验证表达式*/

return reg.test(str); /*进行验证*/}

/*校验电话码格式 */function isTelCode(str) {

var reg= /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/;

return reg.test(str);}

/*校验邮件地址是否合法 */function IsEmail(str) {

var reg=/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;

return reg.test(str);}



附:知乎不错的正则表达式解答