如果您需要复习正则表达式的使用方法,请先查看我们的 交互式教程!
Javascript 通过标准类 RegExp
支持正则表达式,该类在所有现代浏览器中都以原生方式实现。虽然常见的实现并不完全兼容 PCRE,但它支持您可能需要的正则表达式的绝大多数用例。
在 Javascript 中编写正则表达式需要使用模式实例化一个新的 RegExp
对象,以匹配其他字符串。可以使用其正常的 Javascript 构造函数或使用字面量表示法速记来完成此操作,字面量表示法速记还有一个额外的好处,即不必额外转义正则表达式模式中常用的反斜杠和其他特殊元字符。
例如,以下两个语句是等效的
// 使用字面量表示法匹配字母数字字符的字符串 var re = /\w+\d+/; // 使用构造函数表示法创建相同的正则表达式对象 var re = new RegExp("\\w+\\d+");
字面量速记很方便,并且使正则表达式更易于阅读,因此在下面的其余示例中,我们将使用这种格式。
RegExp
对象有很多顶级方法,要测试正则表达式是否匹配 Javascript 中的特定字符串,可以使用 RegExp.test()
。要使用正则表达式从字符串中实际提取信息,则可以使用 RegExp.exec()
调用,该调用在其结果中提供有关匹配的更多信息。
布尔值 = /正则表达式/.test(inputStr)
匹配结果 = /正则表达式/.exec(inputStr)
// 使用正则表达式匹配日期字符串。 var re = /([a-zA-Z]+) (\d+)/; if (re.test("June 24")) { // 确实,表达式 "([a-zA-Z]+) (\d+)" 匹配日期字符串 // 如果需要,可以搜索字符串以查找模式 // 在输入字符串中的匹配位置,以及获取所有匹配项和捕获 // 组。 var matches = re.exec("June 24"); // 这将打印 [0, 7),因为它匹配字符串的开头和结尾 // 字符串 var matchStart = matches.index; var matchEnd = matchStart + matches[0].length; console.log("匹配索引 " + matchStart + ", " + matchEnd); // 结果包含匹配的值。特别是: // matches[0] 始终返回完全匹配的字符串 // matches[1]、matches[2] 等将返回捕获 // 组,按输入字符串中从左到右的顺序 // 因此这将打印 "June 24" console.log("完全匹配: " + matches[0]); // 因此这将打印 "June" console.log("月份: " + matches[1]); // 因此这将打印 "24" console.log("日期: " + matches[2]); } else { // 如果模式不匹配 console.log("正则表达式模式不匹配。:("); }
RegExp
标志创建新的正则表达式对象时,还可以指定其他 标志
来控制在与其他字符串匹配时如何使用模式。特别是,它们可以是以下标志的组合,其中一些是为了方便(也可以通过更改模式来表达),而另一些则在处理复杂字符串时很有用。
这些标志要么在字面量表示法中追加到正则表达式之后,要么在普通表示法中传递给构造函数。
g
- 允许您多次运行 RegExp.exec()
以查找输入字符串中的每个匹配项,直到该方法返回 null
。i
- 使模式不区分大小写,以便它匹配不同大小写形式的字符串m
- 如果您的输入字符串包含换行符 (\n),则需要此标志,此标志允许开始和结束元字符 (^ 和 $ 分别) 匹配每一行的开头和结尾,而不是整个输入字符串的开头和结尾u
- 将正则表达式解释为 Unicode 代码点// 查找所有匹配项(全局匹配)并使用不区分大小写的匹配 var re = /正则表达式/gi; // 使用这两个标志的构造函数表示法创建相同的正则表达式对象 var re = new RegExp("正则表达式", "gi");
还有一些字符串函数可以 匹配
、搜索
,甚至 替换
基于给定正则表达式的子字符串,这可能很有用且易于使用。但是请注意,对于这些调用,标志在这些调用中的工作方式可能略有不同,并且它们可能速度较慢,因为每次调用都必须编译一个新的正则表达式(而不是创建一个正则表达式对象并测试多个字符串)。
匹配结果 = inputStr.match(/正则表达式/标志)
索引 = inputStr.search(/正则表达式/标志)
替换后的字符串 = inputStr.replace(/正则表达式/标志, searchStr)
// 尝试对字符串中的所有日期执行不区分大小写的匹配。 var inputStr = "June 24"; var matches = inputStr.match(/(\w+) (\d+)/i); // 因此这将打印 "June 24" console.log("完全匹配: " + matches[0]); // 这将打印 [0, 7),因为它匹配字符串的开头和结尾 // 字符串 var matchStart = matches.index; var matchEnd = matchStart + matches[0].length; console.log("匹配索引 " + matchStart + ", " + matchEnd); // 使用 String.match() 时,有一个需要注意的地方,如果设置了全局匹配标志, // 则仅返回结果(不带捕获组),而不是匹配 // 对象。例如,以下将打印 "June 24"、"Aug 13" 和 // "Nov 5",但它不会提供每个匹配项的索引。 var inputStr = "June 24, Aug 13, Nov 5"; var matches = inputStr.match(/(\w+) (\d+)/g); for (var i = 0; i < matches.length; i++) { console.log(matches[i]); } // 不过,我们可以使用 String.search() 查找特定模式在 // 输入字符串中的索引。 var inputStr = "There are 15 cats on the bed"; // 这将打印 10,即找到数字的索引 console.log(inputStr.search(/\d+/)); // 如果没有这样的匹配,则返回 -1 console.log(inputStr.search(/123/)); // 尝试替换一些日期字符串 var inputStr = "June 24, August 9, Dec 12"; // 这将打印 "June 1, August 1, Dec 1",因为设置了全局标志。 // 并且匹配应用于所有日期 console.log(inputStr.replace(/\d+/g, "1")); // 尝试反转日期字符串中日期和月份的顺序 // 注意替换字符串如何对捕获的组进行反向引用。 var inputStr = "June 24, August 9, Dec 12"; // 这将重新排序字符串并打印: // 24 of June, 9 of August, 12 of Dec console.log(inputStr.replace(/(\w+) (\d+)/g, "$2 of $1"));
有关在 Javascript 中使用正则表达式的更多信息,请访问以下链接