占有字符和零宽度
正则表达式匹配过程中,如果子表达式匹配到东西,而并非一个位置,并保存到匹配结果中,这样的就称为占有字符,而只匹配到一个位置,或者匹配的内容并不保存到最终匹配结果中,这样的就称为零宽度(锚点)。占有字符是互斥的,而零宽度不是互斥的。
控制权和位置传动
正则表达式从左到右依次进行匹配,通常情况下有一个表达式取得控制权,从字符串的摸个位置开始匹配,一个表达式开始匹配的位置是由前一个子表达匹配成功的结束位置开始的。如果表达式是零宽度,那后一个表达式的匹配位置就是零宽度匹配的位置。
分组
使用小括号包含的子表达式,可以使用回溯引用\n
来引用某个子表达式
1 | <(h[1-6])>\w*?<\/\1> |
匹配结果: <h1>xxx</h1>
零宽度断言
零宽断言用于查找某些内容之前或之后的东西,仅仅用于指定一个位置,不参与内容匹配,类似^
和$
(?=exp)
断言当前位置后面能匹配表达式 exp。
ab(?=123)
ab
123ab234
(?!exp)**
断言当前位置后面不能匹配表达式 exp。
ab(?!123) ab123
ab
234
(?<=exp)
断言当前位置前面能匹配表达式 exp。
(?<=123)ab ab123
ab
234
(?<!exp)
断言当前位置前面不能匹配表达式 exp。
ab(?<!123) ab123
ab
234ab
贪婪与非贪婪
限定符 *
+
?
{n}
{n,}
{n,m}
- 默认情况下使用贪婪模式
- 非贪婪 限定符后加
?
java 匹配换行符
java 正则匹配时,行尾占有字符$
是不包括换行符\n
的,java8 支持使用\R
来表示换行
1 | string = string.replaceAll("\\R", " --linebreak-- "); |