正则表达式高级用法
正则表达式是一种强大的文本匹配工具,它可以帮助我们快速地在大量文本中查、替换或提取特定的内容。除了基本的匹配规则外,正则表达式还有许多高级用法,下面我们来一一介绍。
1. 分组和引用
分组是指将正则表达式中的一部分内容括在小括号中,形成一个子表达式。通过分组,我们可以对子表达式进行重复、选择、引用等操作。例如:
- (a|b)+ 表示匹配一个或多个 a 或 b
- (abc){2,4} 表示匹配 2 到 4 个连续的 abc
- (\d{3})-(\d{4})-\1 表示匹配形如“123-4567-123”的字符串,其中 \1 表示引用第一个分组中匹配到的内容(即“123”)
2. 零宽断言
零宽断言是指在不匹配任何字符的情况下进行位置判断。常见的零宽断言有:
- 正向零宽断言(?=pattern):表示当前位置后面紧跟着 pattern 才能匹配成功
- 负向零宽断言(?!pattern):表示当前位置后面不紧跟着 pattern 才能匹配成功
- 正向回顾后发断言(?<=pattern):表示当前位置前面紧跟着 pattern 才能匹配成功
- 负向回顾后发断言(?<!pattern):表示当前位置前面不紧跟着 pattern 才能匹配成功
例如:
- \d+(?=元) 表示匹配一个数字,它后面紧跟着“元”
- (?<=\$)\d+(\.\d+)? 表示匹配一个以美元符号开头的数字,可以有小数部分regex匹配
3. 非贪婪模式
默认情况下,正则表达式采用贪婪模式,即尽可能多地匹配字符。但有时我们希望正则表达式只匹配最少的字符,这时可以使用非贪婪模式。在量词符后面添加一个问号即可。例
如:
- .*? 表示非贪婪地匹配任意字符
- \w+? 表示非贪婪地匹配一个或多个单词字符
4. 命名捕获组
命名捕获组是指给分组起一个名称,在后续的操作中可以通过名称引用该分组中的内容。命名捕获组使用语法为 (?<name>pattern) 或者 (?'name'pattern)。例如:
- (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}) 表示将日期字符串中的年、月、日分别捕获到名为 year、month、day 的组中
- (?<tag>\w+)>.*?</\k<tag>> 表示匹配形如“<tag>...</tag>”的标签,其中 \k<tag> 表示引用名为 tag 的命名捕获组
5. 后向引用
后向引用是指在正则表达式中使用前面已经匹配到的内容来匹配后面的内容。后向引用使用语法为 \n 或者 \k<name>,其中 n 表示分组的编号,name 表示命名捕获组的名称。例如:
- (\d{2})\1 表示匹配两个连续相同的数字
- (?<quote>['"]).*?\k<quote> 表示匹配形如“'...'”或“"..."”的字符串
以上就是正则表达式的一些高级用法。掌握这些技巧可以帮助我们更加灵活地应对不同场景下的文本处理需求。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。