正则表达式(RegularExpression)

语法

正则表达式(Regular Expression) 是一种特殊的字符串模式(pattern), 用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。本篇主要基于Java语言来说,以应用为主。

在线测试工具: https://tool.oschina.net/regex/

快速入门:https://www.runoob.com/regexp

通过使用正则表达式,可以:

  • 测试字符串内的模式。
  • 替换文本。
  • 基于模式匹配从字符串中提取子字符串。

特殊字符

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\放在它们前面。下表列出了正则表达式中的特殊字符:

字符描述
^1. 匹配字符串开始位置
2. 如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配
3. 在方括号中,表示 ‘非’ 操作
$1. 匹配字符串结尾位置
2. 如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配
.匹配除换行符\n之外的任意单字符。若要匹配包括"\r\n"在内的任意字符,需要使用[\s\S]。
*匹配前面的子表达式零次或多次,同 {0,}
+匹配前面的子表达式一次或多次,同 {1,}
?1. 匹配前面的子表达式零次或一次,同 {0, 1}
2. 指明一个非贪婪限定符
( )圆括号是表示组,主要应用在限制多选结构范围/分组/捕获文本/环视/特殊模式处理
分组与环视
[]定义匹配的字符范围,包含字符集/排除字符集/命名字符集,匹配集合中的单个字符。
例: [0-3] 表示匹配0到3四个数字中的任意一个字符,与(0|1|2|3) 相同,但后者可以匹配多个连续字符,[0123][0-3] 功能相同; [^0-3] 表示匹配0到3四个数字以外的任意一个字符。
{}标记限定符表达式, 用来限定匹配长度。
例:\s{3} 表示匹配三个空白字符;\s{1,3}表示匹配1到3个空白字符
|指明两项之间的选择 。例:f(oo|ee)t 表示匹配‘foot’或‘feet’
\将下一个字符标记为一个特殊字符 (原义字符、反向引用、八进制转义符)
  1. ^$\b均匹配符合某种条件的位置,零宽度的

  2. 根据Java Language Specification的要求,Java源代码的字符串中的反斜线被解释为Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被Java字节码编译器解释。

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

字符描述
*匹配前面的子表达式零次或多次。等效于{0,}。
+匹配前面的子表达式一次或多次。等效于{1,}。
?匹配前面的子表达式零次或一次。等效于{0,1}。
{n}n是非负整数,正好匹配n次
{n,}n是非负整数,至少匹配n次
{n,m}m和n均非负整数,其中n<=m。最少匹配n次且最多匹配m次。

贪婪模式:匹配字符尽可能多,默认模式;非贪婪模式:匹配字符尽可能少,量词后面加?修饰。

文本内容: <h1> 正则表达式应用</h1>

贪婪匹配: (<.*>),匹配结果: <h1> 正则表达式应用</h1>

非贪婪匹配: (<.*?>), 匹配结果: <h1>

标准字符集合

字符描述
\d匹配一个数字字符,同[0-9]
\D匹配一个非数字字符,同[^0-9]
\s匹配任意空白字符,包括空格、制表符、换页符等,同[ \f\n\r\t\v]
\S匹配任意非空白字符,同[^ \f\n\r\t\v]
\w匹配字母、数字、下划线, 同[A-Za-z0-9_]
\W匹配非字母、数字、下划线, 同[^A-Za-z0-9_]

分组与环视

圆括号是表示组,主要应用在限制多选结构范围 / 分组 / 捕获文本 / 环视 / 特殊模式处理。当与或字符|同时使用时,进行分组匹配

测试文本

Java6 Java7 Java8 Java9
字符描述举例
(pattern)匹配pattern并获取这一匹配。可以使用$0…$9属性从结果"匹配"集合中检索捕获的匹配,$0为正则表达式整体。Java(6|7|8) 匹配到 Java6 Java7 Java8, 并获取匹配到对应的版本号
(?:pattern)匹配pattern,但不获取匹配到文本。Java(?:7|8) 匹配Java7 Java8, 但不捕获版本号
(?=pattern)顺序肯定环视Java(?=6|7) 匹配到的结果Java Java , 对应的项’Java6‘ 和’Java7‘
(?!pattern)顺序否定环视Java(?!6|7|8) 匹配到的结果Java , 对应的项’Java9‘
(?<=pattern)逆序肯定环视(?<=J)a[v|\d] 匹配到的结果 av av av av , [v|\d] 为了看出是哪个’a‘
(?<!pattern)逆序否定环视(?<!J)a[v|\d] 匹配到的结果a6 a7 a8 a9

注: 四种环视均是非捕获匹配,不进行存储供以后使用

反向引用

\n: 反向引用,n为正整数。如果\n前面至少有n个捕获子表达式,那么n是反向引用。反向引用的作用通常是用来查找或限定重复查找或限定指定标识配对出现等。例:测试文本Java6 Java7 Java8 Java9,用(Java)7 \1\d匹配到的结果为Java7 Java8

转义字符

字符描述
\f匹配一个换页符,同 \x0c\cL
\n匹配一个换行符,同\x0a\cJ
\r匹配一个回车符,同\x0d\cM
\t匹配一个制表符,同\x09\cl
\v匹配一个垂直制表符,同\x0b\cK

其它字符

字符描述
\b匹配单词边界,即单词与空格的位置
\B匹配非单词边界
\0nnASCII代码中八进制代码为nn的字符。
\xnnASCII代码中十六进制代码为nn的字符
\unnnnUnicode代码中十六进制代码为nnnn的字符。[\u4e00-\u9fa5]:表示任意一个汉字
\cNASCII控制字符。比如\cC代表Ctrl+C(没有应用过)

注释

(?#comment): 用于提供注释让人阅读

修饰符

  • i:ignore-不区分大小写,将匹配设置为不区分大小写。
  • g:global-全局匹配,查找所有的匹配项。
  • m:multi line - 多行匹配,使边界字符^和$匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
  • s:特殊字符圆点.中包含换行符\n

运算优先级

正则表达式从左到右进行计算,并遵循优先级顺序。相同优先级从左到右进行运算,不同优先级先高后低。运算符的优先级顺序:

\ --> ()、(?:)、(?=)、[] --> *、 +、 ?、 {n}、 {n,}、 {n,m}

​ --> ^、 $、\任意元字符、任意字符 --> |

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值