正则表达式元字符,如果要匹配这个元字符本身,前面要加反斜杠转义(Java是加2个反斜杠)。
但是左大括号 { 和右大括号 } 不用转义也可以匹配。
我们用Notepad++演示一下。
支浩宇的姓名:{haoyuName},支浩宇的ID:{haoyuId},备注信息:{notes}
支浩宇的姓名:[haoyuName],支浩宇的ID:{haoyuId},备注信息:{notes}
支浩宇的姓名:(haoyuName),支浩宇的ID:{haoyuId},备注信息:{notes}
zhihaoyu{3}
zhihaoyu{32}
zhihaoyu{0}
zhihaoyu{00}
zhihaoyu{03}
zhihaoyu{3,}
zhihaoyu{0,}
zhihaoyu{3
zhihaoyu{32
zhihaoyu0}
zhihaoyu3,}
zhihaoyu0,}
zhihaoyu{0,,}
zhihaoyu{-3}
zhihaoyu{3.2}
zhihaoyu{big}
zhihaoyu{32big}
zhihaoyu{3big2}
zhihaoyu{0x1}
先演示中括号和小括号,
查找正则表达式:[haoyu
结果:无效的正则表达式
查找正则表达式:(haoyu
结果:无效的正则表达式
查找正则表达式:[haoyuName]
结果:匹配haoyuName的其中一个字母
查找正则表达式:(haoyuName)
结果:匹配haoyuName整个单词,不包括括号
现在演示大括号,
查找正则表达式:{haoyu
结果:匹配{haoyu
查找正则表达式:{haoyu
结果:匹配{haoyu
查找正则表达式:Name}
结果:匹配Name}
查找正则表达式:Name}
结果:匹配Name}
查找正则表达式:{haoyuName}
结果:匹配{haoyuName},包括大括号
查找正则表达式:{haoyuName}
结果:匹配{haoyuName},包括大括号
从以上演示可知,大括号前面加不加转义符号,匹配的结果是一样的。大括号被视为普通字符,而不是元字符。
以下这几个测试用例,大括号被视为元字符,大括号要加转义符号才能匹配到,
zhihaoyu{3}
zhihaoyu{32}
zhihaoyu{0}
zhihaoyu{00}
zhihaoyu{03}
zhihaoyu{3,}
zhihaoyu{0,}
以下这几个测试用例,大括号被视为普通字符,不用加转义符号,直接能匹配到,
zhihaoyu{3
zhihaoyu{32
zhihaoyu0}
zhihaoyu3,}
zhihaoyu0,}
zhihaoyu{0,,}
zhihaoyu{-3}
zhihaoyu{3.2}
zhihaoyu{big}
zhihaoyu{32big}
zhihaoyu{3big2}
zhihaoyu{0x1}
只有当一对大括号中的内容是0、正整数、0和一个逗号、正整数和一个逗号,即
{0}
{3}
{0,}
{3,}
这四种形式,才会把大括号视为元字符。如果能确定不是这四种形式,则正则表达式大括号前面不用加转义符号。如果有可能是这四种形式,那就要加转义符号。
如果是单独一个左大括号跟正整数, 正整数跟单独一个右大括号,也不属于这四种形式,不用加转义符号。
IntelliJ IDEA的提示
在IntelliJ IDEA里面,如果在右大括号前面加转义符号,IDE会提示这个转义符号是多余的:Redundant character escape '}' in RegExp
可以改成:
这是正则表达式的另一个语法。当一对大括号(或中括号)出现时,只要左边的括号加了转义符号,右边的括号加不加都一样,引擎都认为是要转义的。这个语法仅限于中括号和大括号,我试了小括号不是这样,小括号必须左右两边都加转义符号。
我们没有必要去记这些偏门的语法。 最简单的做法是,全都加上转义符号,绝对稳妥(也就是说,我这篇文章根本没必要看)。IDE的提示也不是100%准确的,听不听它的提示,取决于我的心情。