正则表达式和RegExp对象



JavaScript中的正则表达式(RegExp)是一个描述字符模式的对象。它可以包含字母、数字和特殊字符。此外,正则表达式模式可以包含单个或多个字符。

JavaScript的RegExp类表示正则表达式,String和RegExp都定义了使用正则表达式对文本执行强大的模式匹配和搜索替换功能的方法。

正则表达式用于在字符串中搜索特定模式或将模式替换为新字符串。

在JavaScript中有两种方法可以构造正则表达式。

  • 使用RegExp()构造函数。

  • 使用正则表达式字面量。

语法

正则表达式可以用RegExp()构造函数定义,如下所示:

var pattern = new RegExp(pattern, attributes);
or simply
var pattern = /pattern/attributes;

参数

以下是参数的描述:

  • pattern - 指定正则表达式模式的字符串或另一个正则表达式。

  • attributes - 一个可选字符串,包含任何“g”、“i”和“m”属性,分别指定全局、不区分大小写和多行匹配。

在学习正则表达式的示例之前,让我们学习正则表达式的修饰符、量词、字面量字符等。

修饰符

有一些修饰符可以简化使用正则表达式的方式,例如大小写敏感性、多行搜索等。

序号 修饰符和描述
1

i

执行不区分大小写的匹配。

2

m

指定如果字符串包含换行符或回车符,^和$运算符将匹配换行符边界,而不是字符串边界。

3

g

执行全局匹配,即查找所有匹配项,而不是在第一次匹配后停止。

方括号

方括号([])在正则表达式中具有特殊含义。它们用于查找一系列字符。

序号 表达式和描述
1

[...]

方括号内任意一个字符。

2

[^...]

方括号外任意一个字符。

3

[0-9]

匹配从0到9的任何十进制数字。

4

[a-z]

匹配从az的任何小写字符。

5

[A-Z]

匹配从AZ的任何大写字符。

6

[a-Z]

匹配从aZ的任何字符。

上面显示的范围是通用的;您也可以使用范围[0-3]来匹配从0到3的任何十进制数字,或者使用范围[b-v]来匹配从bv的任何小写字符。

量词

方括号字符序列和单个字符的频率或位置可以用特殊字符表示。每个特殊字符都有其特定的含义。+、*、?和$标志都跟在一个字符序列之后。

序号 表达式和描述
1

p+

它匹配任何包含一个或多个“p”的字符串。

2

p*

它匹配任何包含零个或多个“p”的字符串。

3

p?

它匹配任何包含最多一个“p”的字符串。

4

p{N}

它匹配任何包含N个连续“p”的字符串

5

p{2,3}

它匹配任何包含两个或三个连续“p”的字符串。

6

p{2, }

它匹配任何包含至少两个连续“p”的字符串。

7

p$

它匹配任何以“p”结尾的字符串。

8

^p

它匹配任何以“p”开头的字符串。

9

?!p

它匹配任何后面不跟着字符串“p”的字符串。

示例

以下示例更详细地解释了字符匹配。

序号 表达式和描述
1

[^a-zA-Z]

它匹配任何不包含从az以及从AZ的任何字符的字符串。

2

p.p

它匹配任何包含“p”,后面跟任何字符,然后再跟另一个“p”的字符串。

3

^.{2}$

它匹配任何包含恰好两个字符的字符串。

4

<b>(.*)</b>

它匹配任何包含在<b>和</b>之间的字符串。

5

p(hp)*

它匹配任何包含一个“p”,后面跟零个或多个“hp”序列的字符串。

字面字符

字面字符可以在正则表达式中使用反斜杠 (\) 来使用。它们用于在正则表达式中插入特殊字符,例如制表符、空字符、Unicode字符等。

序号 字符 & 说明
1

字母数字

自身

2

\0

空字符 (\u0000)

3

\t

制表符 (\u0009)

4

\n

换行符 (\u000A)

5

\v

垂直制表符 (\u000B)

6

\f

换页符 (\u000C)

7

\r

回车符 (\u000D)

8

\xnn

由十六进制数 nn 指定的拉丁字符;例如,\x0A 与 \n 相同

9

\uxxxx

由十六进制数 xxxx 指定的 Unicode 字符;例如,\u0009 与 \t 相同

10

\cX

控制字符 ^X;例如,\cJ 等效于换行符 \n

元字符

元字符只是一个以反斜杠开头的字母字符,它赋予组合以特殊含义。

例如,您可以使用 '\d' 元字符搜索一大笔钱:/([\d]+)000/,这里的 \d 将搜索任何数字字符的字符串。

下表列出了可在 PERL 风格正则表达式中使用的一组元字符。

序号 字符 & 说明
1

.

单个字符

2

\s

空格字符(空格、制表符、换行符)

3

\S

非空格字符

4

\d

数字 (0-9)

5

\D

非数字

6

\w

单词字符 (a-z, A-Z, 0-9, _)

7

\W

非单词字符

8

[\b]

字面退格符(特殊情况)。

9

[aeiou]

匹配给定集合中的单个字符

10

[^aeiou]

匹配给定集合之外的单个字符

11

(foo|bar|baz)

匹配指定的任何备选方案

让我们学习如何在下面创建正则表达式。

let exp = /tutorialspoint/i 
  • /tutorialspoint/ – 它查找“tutorialspoint”字符串的匹配项。

  • i – 在将模式与字符串匹配时,它忽略字符的大小写。因此,它与“TutoiralsPoint”或“TUTORIALSpoint”等匹配。

let exp = /\d+/
  • \d – 它匹配 0 到 9 的数字。

  • + – 它匹配一个或多个数字。

let exp = /^Hi/
  • ^ - 它匹配文本的开头。

  • Hi – 它检查文本开头是否包含“Hi”。

Let exp = /^[a-zA-Z0-9]+@[a-zA-Z]+\.[a-zA-Z]{2,3}$/

上面的正则表达式验证电子邮件。它看起来很复杂,但很容易理解。

  • ^ - 电子邮件地址的开头。

  • [a-zA-Z0-9] – 开头应该包含字母数字字符。

  • + - 它应该包含至少一个字母数字字符。

  • @ - 字母数字字符后必须有“@”字符。

  • [a-zA-Z]+ - “@”字符后,必须包含至少 1 个字母数字字符。

  • \. – 它必须包含一个点。

  • [a-zA-Z] – 点后,电子邮件应该包含字母字符。

  • {2, 3} – 点后,它只应包含 2 个或 3 个字母字符。它指定长度。

  • $ - 它表示模式的结尾。

现在,问题是,我们是否可以使用 search() 或 replace() 方法通过传递字符串作为参数来搜索或替换字符串中的文本;那么正则表达式的用途是什么呢?

问题很明显。让我们通过下面的示例来理解它。

示例

在下面的示例中,我们使用正则表达式字面量来定义正则表达式。该模式匹配“tutorialspoint”字符串,而不比较字符的大小写。

在第一种情况下,字符串 search() 方法搜索“tutorialspoint”字符串,它执行区分大小写的匹配。因此,它返回 -1。

在第二种情况下,我们将正则表达式作为 search() 方法的参数传递。它执行不区分大小写的匹配。因此,它返回 11,即所需模式的索引。

<html>
<head>
   <title> JavaScript - Regular Expression </title>
</head>
<body>
   <p id = "output"> </p>
   <script>
      const output = document.getElementById("output");
      let pattern = /tutorialspoint/i;
      let str = "Welcome to TuTorialsPoint! It is a good website!";
      let res = str.search('tutorialspoint');
      output.innerHTML += "Searching using the string : " + res + "<br>";
      res = str.search(pattern);
      output.innerHTML += "Searching using the regular expression : " + res;
   </script>
</body>
</html>

执行程序以查看所需的结果。

示例

在下面的示例中,我们使用 replace() 方法匹配模式并将其替换为“100”字符串。

这里,模式匹配数字对。输出显示字符串中的每个数字都被替换为“100”。您也可以在字符串中添加字母字符。

<html>
<head>
   <title> JavaScript - Regular expression </title>
</head>
<body>
   <p id = "output"> </p>
   <script>
      let pattern = /\d+/g; // Matches pair of digits
      let str = "10, 20, 30, 40, 50";

      let res = str.replace(pattern, "100");
      document.getElementById("output").innerHTML = 
		"String after replacement : " + res;
   </script>
</body>
</html>

执行程序以查看所需的结果。

示例(电子邮件验证)

在下面的示例中,我们使用带有“new”关键字的 RegExp() 构造函数来创建一个正则表达式。此外,我们还将模式以字符串格式作为构造函数的参数传递。

在这里,我们使用正则表达式验证电子邮件。在第一种情况下,电子邮件有效。在第二种情况下,电子邮件不包含“@”字符,因此 test() 方法返回 false。

<html>
<body>
   <p id = "output"> </p>
   <script>
      const pattern = new RegExp('^[a-zA-Z0-9]+@[a-zA-Z]+\.[a-zA-Z]{2,3}$');
      document.getElementById("output").innerHTML = 
		"[email protected] is valid? : " + pattern.test('[email protected]') + "<br>" +
      "abcdgmail.com is valid? : " + pattern.test('abcdgmail.com');
</script>
</body>
</html>

因此,正则表达式可用于查找文本中的特定模式并执行替换等操作。

RegExp 属性

以下是与 RegExp 相关的属性列表及其说明。

序号 属性 & 说明
1 constructor

指定创建对象原型的函数。

2 global

指定是否设置了“g”修饰符。

3 ignoreCase

指定是否设置了“i”修饰符。

4 lastIndex

开始下一次匹配的索引。

5 multiline

指定是否设置了“m”修饰符。

6 source

模式的文本。

在以下部分,我们将有一些示例来演示 RegExp 属性的使用。

RegExp 方法

以下是与 RegExp 相关的方法列表及其说明。

序号 方法 & 说明
1 exec()

在其字符串参数中执行搜索匹配项。

2 test()

测试其字符串参数中的匹配项。

3 toSource()

返回表示指定对象的 对象文字;您可以使用此值来创建新对象。

4 toString()

返回表示指定对象的字符串。

在以下部分,我们将有一些示例来演示 RegExp 方法的使用。

广告