JavaScript/正则表达式
外观
JavaScript 在字符串中搜索匹配项时实现了正则表达式(简称 regex)。与其他脚本语言一样,这允许超越简单的逐字匹配进行搜索,甚至可以用于解析特定格式的字符串。
与字符串不同,正则表达式以斜杠(/)字符分隔,并且可能附加一些选项。
正则表达式最常与 string.match() 和 string.replace() 方法结合使用。
概览,举例说明
strArray = "Hello world!".match(/world/); // Singleton array; note the slashes
strArray = "Hello!".match(/l/g); // Matched strings are returned in a string array
"abc".match(/a(b)c/)[1] === "b" // Matched subgroup is the 2nd item (index 1)
str1 = "Hey there".replace(/Hey/g, "Hello");
str2 = "N/A".replace(/\//g, ","); // Slash is escaped with \
str3 = "Hello".replace(/l/g, "m").replace(/H/g, "L").replace(/o/g, "a"); // Pile
if (str3.match(/emma/)) { console.log("Yes"); }
if (str3.match("emma")) { console.log("Yes"); } // Quotes work as well
"abbc".replace(/(.)\1/g, "$1") === "abc" // Backreference
JavaScript 的正则表达式集遵循扩展集。虽然将 Regex 模式从 JavaScript 复制到其他位置可能会按预期工作,但某些较旧的程序可能无法按预期工作。
- 在搜索词中,\1 用于反向引用匹配的组,如其他实现中一样。
- 在替换字符串中,$1 被替换为搜索中匹配的组,而不是 \1。
- 示例:"abbc".replace(/(.)\1/g, "$1") => "abc"
- | 是魔法字符,\| 是字面量
- ( 是魔法字符,\( 是字面量
- 语法 (?=...), (?!...), (?<=...), 和 (?<!...) 不可用。
- 匹配
- string = "Hello world!".match(/world/);
- stringArray = "Hello world!".match(/l/g); // 匹配的字符串将返回到字符串数组中
- "abc".match(/a(b)c/)[1] => "b" // 匹配的子组是结果数组的第二个成员(索引为“1”)
- 替换
- string = string.replace(/不带引号的表达式/g, "替换");
- string = string.replace(/以这种方式\/转义斜杠/g, "替换");
- string = string.replace( ... ).replace ( ... ). replace( ... );
- 测试
- if (string.match(/不带引号的正则表达式/)) {
单字母修饰符
g | 全局。匹配列表将返回到数组中。 |
i | 不区分大小写的搜索 |
m | 多行。如果操作数字符串有多行,则 ^ 和 $ 匹配字符串中每一行的开头和结尾,而不是仅匹配整个字符串的开头和结尾
|
运算符 | 效果 |
---|---|
\b | 匹配单词的边界。 |
\w | 匹配字母数字字符,包括“_”。 |
\W | \w 的否定。 |
\s | 匹配空格字符(空格、制表符、换行符、换页符) |
\S | \s 的否定。 |
\d | 匹配数字。 |
\D | \d 的否定。 |
对于复杂操作,函数可以处理匹配的子字符串。在以下代码中,我们将所有单词大写。由于要大写的每个字母都是不同的字符,因此无法通过简单的替换来完成
var capitalize = function(matchobj) {
var group1 = matchobj.replace(/^(\W)[a-zA-Z]+$/g, "$1");
var group2 = matchobj.replace(/^\W([a-zA-Z])[a-zA-Z]+$/g, "$1");
var group3 = matchobj.replace(/^\W[a-zA-Z]([a-zA-Z]+)$/g, "$1");
return group1 + group2.toUpperCase() + group3;
};
var classicText = "To be or not to be?";
var changedClassicText = classicText.replace(/\W[a-zA-Z]+/g, capitalize);
console.log(changedClassicText==="To Be Or Not To Be?");
该函数针对每个子字符串调用。以下是函数的签名
function (''<matchedSubstring>[, <capture1>, ...<captureN>, <indexInText>, <entireText>]'') {
...
return ''<stringThatWillReplaceInText>'';
}
- 第一个参数是与模式匹配的子字符串。
- 接下来的参数是子字符串中的捕获。参数的数量与捕获的数量相同。
- 下一个参数是从文本开头开始的子字符串开头的索引。
- 最后一个参数是整个文本的其余部分。
- 返回值将放在文本中,而不是匹配的子字符串。
- 正则表达式 - 一本专门介绍正则表达式的 Wikibook。
- Perl 正则表达式参考 - 一本关于 Perl 编程语言的书中专门介绍正则表达式的章节。
- W3schools.com 上的 JavaScript RegExp 对象参考
- regular-expressions.info 上的 JavaScript RexExp 测试器
- mozilla.org 上的 Javascript 中的正则表达式
- mozilla.org 上的 JavaScript RegExp 对象