正则表达式

本文详细介绍了正则表达式的概念、基本语法,包括普通字符、特殊字符、限定符、定位符、选择、反向引用和修饰符的用法。通过实例解析了如何进行字符串匹配、非贪婪匹配及边界定位。同时,讨论了反向引用在查找重复单词中的应用,并展示了各种修饰符如i、g和m的作用。此外,还讲解了元字符如w、d和s的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

  正则表达式(regular expression)是一种字符串匹配模式(pattern),用来搜索、替换或取出符合某个条件的子字符串。1

语法

  正则表达式由普通字符(例如字符 a 到 z)以及特殊字符(称为“元字符”)组成。

普通字符

  包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

字符描述
[ABC]匹配 […] 中的所有字符。
[^ABC]匹配除了 […] 中字符的所有字符。
[A-Z][A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
.匹配除换行符 \n 之外的任何单字符。
[\s\S]匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。

特殊字符

  所谓特殊字符,就是一些有特殊含义的字符。

字符描述
[标记一个中括号表达式的开始。
{标记限定符表达式的开始。
\将下一个字符标记为 特殊字符、原义字符、向后引用或八进制转义符。

限定符

  限定符用来指定一个条件要出现多少次才能匹配。有 ? * +{n} {n,} {n,m} 共6种。

字符描述
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
*匹配前面的子表达式零次或多次。
+匹配前面的子表达式一次或多次。
{n}n 是一个非负整数。匹配确定的 n 次。
{n,}n 是一个非负整数。至少匹配n 次。
{n,m}m 和 n 均为非负整数。最少匹配 n 次且最多匹配 m 次。

  注意:限定符都是贪婪的,它们会尽可能多的匹配文字,在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

<h1>RUNOOB-菜鸟教程</h1>

// 贪婪:下面的表达式匹配从开始 (<) 到 (>) 之间的所有内容。
/<.*>/  

// 非贪婪:下面的表达式只匹配 <h1>。
/<.*?>/

定位符

  定位符用来描述字符串或单词的边界,^$ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

字符描述
^匹配输入字符串的开始位置。在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。
$匹配输入字符串的结尾位置。
\b匹配一个单词边界,即字与空格间的位置。
\B非单词边界匹配。

选择

  () 表示捕获分组,把每个分组里的匹配的值保存起来,相邻的选择项之间用 | 分隔。
  ?: ?= ?!是非捕获元。

字符描述
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
(?=pattern)正向肯定预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。exp1(?=exp2):查找 exp2 前面的 exp1。
(?!pattern)正向否定预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。exp1(?!exp2):查找后面不是 exp2 的 exp1。
(?<=pattern)反向肯定预查,与正向肯定预查类似,只是方向相反。(?<=exp2)exp1:查找 exp2 后面的 exp1。
(?<!pattern)反向否定预查,与正向否定预查类似,只是方向相反。(?<!exp2)exp1:查找前面不是 exp2 的 exp1。
x|y匹配 x 或 y。
\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符。
// (?:pattern)
industr(?:y|ies) // 比 'industry|industries' 更简略的表达式。

// (?=pattern)
Windows(?=95|98|NT|2000) // 能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。

// (?!pattern)
Windows(?!95|98|NT|2000) // 能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。

// (?<=pattern)
(?<=95|98|NT|2000)Windows // 能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。

// (?<!pattern)
(?<!95|98|NT|2000)Windows // 能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。

反向引用

  ()将相关匹配存储到一个临时缓冲区中,所捕获的子匹配从左到右的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个。缓冲区使用 \n 访问,其中 n 为一个标识特定缓冲区的十进制数。

// 反向引用常用于查找文本中两个相同的相邻单词。
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/igm; // 第二部分是对以前捕获的子匹配项的引用,\1 指定第一个子匹配项。
document.write(str.match(patt1));
 // Is is,of of,up up
 
var str = "https://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1); // str.match(patt1) 返回一个数组,索引 0 对应的是整个字符串,索引 1 对应第一个匹配符
for (var i = 0; i < arr.length ; i++) {
    document.write(arr[i]);
    document.write("<br>");
}
// https://www.runoob.com:80/html/html-tutorial.html
// https
// www.runoob.com
// :80
// /html/html-tutorial.html

修饰符(标记)

  标记不写在正则表达式里,标记位于表达式之外,格式 /pattern/flags

修饰符含义
iignore - 不区分大小写
gglobal - 全局匹配
mmulti line - 多行匹配
s特殊字符圆点 . 中包含换行符 \n
var str="Google runoob taobao runoob"; 
var n1=str.match(/runoob/);   // 查找第一次匹配项
var n2=str.match(/runoob/g);  // 查找所有匹配项

元字符

  下面是一些其他常用字符。

字符描述
\w匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。
\W匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。
\S匹配任何非空白字符。

  1. 正则表达式-菜鸟教程 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值