跳转至内容

JavaScript/正则表达式

来自Wikibooks,开放世界中的开放书籍
上一页:数组 索引 下一页:运算符

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 多行。如果操作数字符串有多行,则 ^ 和 $ 匹配字符串中每一行的开头和结尾,而不是仅匹配整个字符串的开头和结尾
"a\nb\nc".replace(/^b$/g,"d") === "a\nb\nc"
"a\nb\nc".replace(/^b$/gm,"d") === "a\nd\nc"

   

运算符

[编辑 | 编辑源代码]
运算符 效果
\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>'';
}
  • 第一个参数是与模式匹配的子字符串。
  • 接下来的参数是子字符串中的捕获。参数的数量与捕获的数量相同。
  • 下一个参数是从文本开头开始的子字符串开头的索引。
  • 最后一个参数是整个文本的其余部分。
  • 返回值将放在文本中,而不是匹配的子字符串。
[编辑 | 编辑源代码]


上一页:数组 索引 下一页:运算符
华夏公益教科书