Javascript 简明教程

Regular Expressions and RegExp Object

regular expression (正则表达式) 在 JavaScript 中是一个描述字符模式的对象。它可以包含字母数字和特殊字符。而且,正则表达式模式可以包含单个或多个字符。

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

正则表达式用来在字符串中搜索特定模式,或用一个新字符串替换该模式。

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

  1. Using the RegExp() constructor.

  2. 使用正则表达式的文本。

Syntax

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

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

Parameters

以下是参数说明 −

  1. pattern − 一个字符串,指定正则表达式的模式或另一个正则表达式。

  2. attributes − 一个可选字符串,包含任何表示全局、不区分大小写和多行匹配的“g”、“i”和“m”属性。

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

Modifiers

几种修饰符可以简化使用 regexps, 的方式,例如大小写敏感、多行搜索等。

Sr.No.

Modifier & Description

1

i Perform case-insensitive matching.

2

m 指明如果字符串有换行符或回车字符,^ 和 $ 运算符现在会匹配换行边界,而不是字符串边界。

3

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

Brackets

括号 ([]) 在正则表达式中使用时具有特殊的含义。它们用于查找字符范围。

Sr.No.

Expression & Description

1

[…​] 括号内的任何一个字符。

2

[^…​] 括号外的任何一个字符。

3

[0-9] 它匹配 0 到 9 之间的任何十进制数字。

4

[a-z] 它匹配小写 a *through lowercase *z 中的任何字符。

5

[A-Z] 它匹配大写 A 到大写 Z 中的任何字符。

6

[a-Z] 它匹配小写 a 到大写 Z 中的任何字符。

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

Quantifiers

括号字符序列和单个字符的频率或位置可以通过特殊字符表示。每个特殊字符都有特定的含义。+, *, ?, 和 $ 标志都跟随一个字符序列。

Sr.No.

Expression & Description

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 的字符串。

Examples

以下示例详细解释了如何匹配字符。

Sr.No.

Expression & Description

1

[^a-zA-Z] 匹配不包含 azA 及其之后的 Z 范围内任何字符的任何字符串。

2

p.p 匹配包含 p, ,随后是任意字符,而后依次是另一个 p 的任何字符串。

3

^.{2}$ 匹配包含正好两个字符的任何字符串。

4

&lt;b&gt;(. )</b>*匹配以 <b> 和 </b> 括起的任何字符串。

5

p(hp) 匹配包含 *p 然后是零个或多个 hp 序列实例的任何字符串。

Literal characters

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

Sr.No.

Character & Description

1

Alphanumeric Itself

2

\0 The NUL character (\u0000)

3

\t Tab (\u0009

4

\n Newline (\u000A)

5

\v Vertical tab (\u000B)

6

\f Form feed (\u000C)

7

\r Carriage return (\u000D)

8

\xnn 十六进制数字 nn 指定的拉丁字符;例如,\x0A 等同于 \n

9

\uxxxx 十六进制数字 xxxx 指定的 Unicode 字符;例如,\u0009 等同于 \t

10

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

Metacharacters

元字符只是一个字母字符,后面跟着一个反斜杠,用于赋予该组合特殊含义。

例如,可以使用“\d”元字符搜索一大笔钱: /([\d]+)000/ ,此处 \d 将搜索包含所有数字字符的字符串。

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

Sr.No.

Character & Description

1

. a single character

2

\s 一个空白字符(空格、制表符、换行符)

3

\S non-whitespace character

4

\d a digit (0-9)

5

\D a non-digit

6

\w 一个单词字符(a-z、A-Z、0-9、_)

7

\W a non-word character

8

[\b] 一个反斜杠文字(特殊情况)。

9

[aeiou] 匹配给定集合中的单个字符。

10

[^aeiou] 匹配给定集合之外的单个字符。

11

*(foo

bar

baz)* 匹配指定的所有选项。

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

let exp = /tutorialspoint/i
  1. /tutorialspoint/ – 它匹配“tutorialspoint”字符串。

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

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

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

let exp = /^Hi/
  1. ^ – 它匹配文本的开头。

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

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

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

  1. ^ – 电子邮件地址的开头。

  2. [a-zA-Z0-9] – 它在开头应包含字母数字字符。

  3. + – 它应至少包含一个字母数字字符。

  4. @ – 它在字母数字字符后必须包含字符“@”。

  5. [a-zA-Z]+ - 在 '@' 字符后,必须包含至少 1 个字母数字字符。

  6. \. – 之后必须包含一个句点。

  7. [a-zA-Z] – 在句点之后,电子邮件应当包含字母字符。

  8. {2, 3} – 在句点之后,应当只包含 2 或 3 个字母字符。它指定长度。

  9. $ - 它表示模式的结尾。

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

这个问题显而易见。让我们通过以下示例来理解它。

Example

在以下示例中,我们使用正则表达式字面量来定义正则表达式。模式与 '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>

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

Example

在以下示例中,我们使用 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>

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

Example (Email validation)

在以下示例中,我们使用带 '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 =
		"abcd@gmail.com is valid? : " + pattern.test('abcd@gmail.com') + "<br>" +
      "abcdgmail.com is valid? : " + pattern.test('abcdgmail.com');
</script>
</body>
</html>

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

RegExp Properties

以下是与 RegExp 相关的属性及其描述的列表。

Sr.No.

Property & Description

1

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

2

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

3

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

4

lastIndex 开始下一次匹配的索引。

5

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

6

source 模式的文本。

在以下部分中,我们将提供一些示例来说明 RegExp 属性的用法。

RegExp Methods

以下是与 RegExp 相关的函数及其描述的列表。

Sr.No.

Method & Description

1

exec() 在字符串参数中执行搜索以查找匹配。

2

test() 在其字符串参数中测试匹配项。

3

toSource() 返回一个表示指定对象的字面量对象;可使用此值创建新对象。

4

toString() 返回一个表示指定对象的字符串。

在以下几个部分中,我们将列出一些示例来说明正则表达式方法的使用。