JavaScript

JavaScript 知识量:26 - 101 - 483

4.2 RegExp><

RegExp类型- 4.2.1 -

JavaScript 的 RegExp 类型用于表示正则表达式,它是一种在文本中查找符合特定模式的字符串的方式。RegExp 对象包含两个预定义的属性:global(布尔值,指示RegExp是否具有g标志)和ignoreCase(布尔值,指示RegExp是否具有i标志)。

以下是RegExp对象的一些主要方法和属性:

1. 正则表达式字面量:在JavaScript中,可以使用正则表达式字面量,比如 /abc/gi。其中 "abc" 是匹配的模式,而 "g" 和 "i" 是标志。

  • g(全局):表示全局搜索,即不仅仅在找到第一个匹配项后停止,而是继续寻找字符串中的所有匹配项。

  • i(忽略大小写):表示在搜索时忽略字符的大小写。

  • m(多行):表示将多行模式与'^'和'$'一起使用。

2. RegExp 构造函数:可以用构造函数 new RegExp() 创建一个RegExp对象。例如,let regex = new RegExp('abc', 'gi');。

3. test() 方法:用于在字符串中搜索匹配的文本。如果找到匹配项,则返回 true;否则返回 false。例如,let regex = /abc/g; let result = regex.test('abcdef');。

4. exec() 方法:在一个字符串中搜索匹配的文本。返回一个数组,其中包含第一个匹配项的信息,或者在没有匹配项时返回 null。例如,let regex = /abc/g; let result = regex.exec('abcdef');,此时 result[0] 是 'abc'。

5. match() 方法:在一个字符串中搜索匹配的文本并返回一个数组。如果没有找到匹配项,则返回 null。例如,let regex = /abc/g; let result = 'abcdef'.match(regex);,此时 result[0] 是 'abc'。

6. search() 方法:在一个字符串中搜索匹配正则表达式的文本。返回第一个匹配的索引位置或 -1。例如,let regex = /abc/g; let result = 'abcdef'.search(regex);,此时 result 是 1(因为 'abc' 在 'abcdef' 中的位置是 1)。

7. replace() 方法:在字符串中替换匹配的部分。可以传入两个参数,第一个参数是要替换的文本或函数,第二个参数是要替换成的文本。例如,let regex = /abc/g; let result = 'abcdef'.replace(regex, '123');,此时 result 是 '123def'。

RegExp实例属性- 4.2.2 -

JavaScript的RegExp对象有许多实例属性,它们提供了关于正则表达式的信息。以下是一些主要的RegExp实例属性:

  • global:这是一个只读属性,表示RegExp是否具有g标志。如果正则表达式包含g标志,该属性返回true;否则返回false。

  • ignoreCase:这是一个只读属性,表示RegExp是否具有i标志。如果正则表达式包含i标志,该属性返回true;否则返回false。

  • multiline:这是一个只读属性,表示RegExp是否具有m标志。如果正则表达式包含m标志,该属性返回true;否则返回false。

  • dotAll:这是一个只读属性,表示RegExp是否具有s标志。如果正则表达式包含s标志,该属性返回true;否则返回false。此属性在ECMAScript 2018中添加。

  • unicode:这是一个只读属性,表示RegExp是否具有u标志。如果正则表达式包含u标志,该属性返回true;否则返回false。此属性在ECMAScript 2018中添加。

  • lastIndex:这是一个可读写的整数,代表下一次匹配的开始位置。只有当正则表达式使用了 g 标志时,这个属性才会变化。此属性在ECMAScript 1开始引入。

例如:

let regex = /abc/g;  
console.log(regex.global); // false  
console.log(regex.ignoreCase); // false  
console.log(regex.multiline); // false  
console.log(regex.dotAll); // false  
console.log(regex.unicode); // false  
console.log(regex.lastIndex); // 0

RegExp实例方法- 4.2.3 -

JavaScript的RegExp对象有许多实例方法,这些方法可以帮助执行各种正则表达式相关的操作。以下是一些主要的RegExp实例方法:

1. exec(string):对字符串执行正则表达式搜索。返回一个数组,其第一个元素是完全匹配的结果数组,第二个元素是任何括号子表达式的匹配结果,剩下的元素依次匹配正则表达式中的元素。如果没有匹配项,返回 null。例如:

let regex = /(\d+)/g;  
let str = 'Example text 12345';  
let result = regex.exec(str);  
console.log(result);  // [ '12345', '5' ]

2. test(string):对字符串执行正则表达式搜索。如果找到一个匹配,返回 true;如果没有找到匹配,返回 false。例如:

let regex = /123/;  
let str = 'Example text 12345';  
console.log(regex.test(str));  // true

3. match(string):对字符串执行正则表达式搜索。如果找到一个匹配,返回一个完全匹配的结果数组;如果没有找到匹配,返回 null。这个方法与exec()方法非常类似,但是当正则表达式使用了 g 标志时,它们的行为不同。match()方法不会改变 lastIndex 属性。

4. search(string):对字符串执行正则表达式搜索。如果找到一个匹配,返回字符串的起始索引;如果没有找到匹配,返回 -1。

5. replace(string, replacement):在字符串中替换与正则表达式匹配的文本。返回新的字符串。第一个参数是要替换的文本,第二个参数是替换的文本。如果正则表达式使用了 g 标志,那么所有匹配都会被替换。否则,只有第一个匹配会被替换。例如:

let regex = /Example/;  
let str = 'Example text';  
console.log(regex.replace(str, 'Demo'));  // 'Demo text'

6. split(string):用正则表达式分割字符串。返回一个数组,包含了分割的各个部分。如果没有找到匹配,返回空数组。

7. compile(pattern[, flags]):编译正则表达式。这个方法通常不常使用,因为正则表达式在创建实例时已经编译了。这个方法可以用来改变已有的正则表达式的模式或者标志。

8. lastIndex:当正则表达式使用了 g 标志或者 y 标志时,这个属性包含了下一次匹配的开始位置。只有在下一次调用 exec() 或者 test() 方法时才会被改变。如果正则表达式没有使用 g 或者 y 标志,这个属性不会改变。

模式局限- 4.2.4 -

JavaScript中的RegExp对象和正则表达式功能有一些局限性和特殊行为,其中一些可能对某些复杂或高级的模式匹配造成限制。以下是一些主要的局限性和注意事项:

  • 不完善的Unicode支持:JavaScript的正则表达式对Unicode的支持并不完全。例如,它不能很好地处理四个字节的Unicode字符(比如一些表情符号)。

  • 缺乏命名捕获组功能:在许多其他正则表达式实现中,可以使用命名捕获组来为匹配的组指定一个名称。然而,JavaScript不支持这个特性。

  • 反向引用只能匹配整个单词:在JavaScript中,\b 是一个单词边界,这意味着反向引用只能匹配整个单词。如果想反向引用字符串中的非完整单词部分,JavaScript无法支持。

  • 缺乏条件(预测先行)和后行断言:JavaScript的正则表达式不直接支持条件(预测先行)和后行断言,这是某些复杂模式匹配用到的特性。

  • 贪婪匹配与非贪婪匹配的混淆:在JavaScript中,正则表达式的贪婪量词(例如*、+、?和{})默认是贪婪的。如果需要非贪婪匹配(例如在找到尽可能少的匹配项时),需要明确使用*?、+?、??或{n,}?。而在某些语言中,如Python和Perl,默认就是非贪婪的。

  • 缺乏前瞻断言:前瞻断言允许在指定的位置之后查找一个特定的模式。JavaScript不支持这种特性。

  • 正则表达式标志的组合:在JavaScript中,不能同时使用多个标志创建正则表达式。例如,/abc/gmi这样的表达式会报错,因为不能同时使用'g'(全局)、'm'(多行)和'i'(忽略大小写)这三个标志。

这些是JavaScript对正则表达式支持的一些主要局限。不过,虽然JavaScript的正则表达式可能不如某些其他语言的功能强大,但通常来说,对于大多数常见的文本处理任务来说,它的功能已经足够好了。