匹配开头和结尾
用
^
表示开头,用$
表示结尾
匹配指定范围
- [123456789]可以匹配[1~9],还有另外一种表示方法[0-9a-fA-F],
还有一种排除法,即不包含指定范围的字符。[^1-9]
或规则匹配
- 用
|
连接的两个正则规则是或规则,例如AB|CD
使用括号
- 如果匹配字符串learn java、learn php、learn go,可以这样写
learn\\s(java|php|go)
分组匹配
- 如何正则匹配区号-电话号这个规则,按照前边的介绍完全可以匹配到,但是匹配成功后,如何区分区号和电话号码,分别存入数据库。
也就是如何提取匹配的子串?
正确的方法是用(…)先把要提取的规则分组,然后引入java.until.regex
包,用Pattern
对象匹配,匹配获得一个Matcher
对象,如果匹配成功,可以直接从Matcher.group(index)
返回子串
非贪婪匹配
- 给定一个字符串表示的数字,判断该数字末尾
0
的个数,例如123000
末尾3个0
,10010
末尾1个0
。
我们的思路是这样的:利用分组匹配把字符串分为末尾为0
的部分和其余部分,正则表达式可以这样写:(\d+)(0*)
然而事情并不是我们想象的那样,为0
的那部分始终为空,因为(\d+)已经包含匹配后面的0
,第二部分规则根本没机会
所以我们要让(\d+)少匹配,让(0*)尽量多匹配,就必须使用非贪婪规则。
在规则(\d+)后面加?即可表示非贪婪匹配
反向引用
- 如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个xxxx
1 | public class Main{ |
上述代码运行的结果就是:
1 | the quick brown fox jumps <b>over</b> the <b>lazy</b> dog. |
它实际上把任何4字符单词的前后用xxxx括起来
模板引擎
- 模板引擎是指,定义一个字符串作为模板:
1 | Hello,${name}! You are learning ${lang}! |
其中${key},也就是被替换的内容,当传入一个
Map<String,String>
给模板后,将key替换为value的值
例如,传入Map为:
1 | { |
最终输出结果为:
1 | Hello,Bob!You are learning Java! |