0%

复杂匹配规则

匹配开头和结尾

^表示开头,用$表示结尾

匹配指定范围

  • [123456789]可以匹配[1~9],还有另外一种表示方法[0-9a-fA-F]
    还有一种排除法,即不包含指定范围的字符。[^1-9]

或规则匹配

  • |连接的两个正则规则是或规则,例如AB|CD

使用括号

  • 如果匹配字符串learn javalearn phplearn go,可以这样写learn\\s(java|php|go)

分组匹配

  • 如何正则匹配区号-电话号这个规则,按照前边的介绍完全可以匹配到,但是匹配成功后,如何区分区号和电话号码,分别存入数据库。
    也就是如何提取匹配的子串?
    正确的方法是用(…)先把要提取的规则分组,然后引入java.until.regex包,用Pattern对象匹配,匹配获得一个Matcher对象,如果匹配成功,可以直接从Matcher.group(index)返回子串

非贪婪匹配

  • 给定一个字符串表示的数字,判断该数字末尾0的个数,例如123000末尾3个010010末尾1个0
    我们的思路是这样的:利用分组匹配把字符串分为末尾为0的部分和其余部分,正则表达式可以这样写:(\d+)(0*)
    然而事情并不是我们想象的那样,为0的那部分始终为空,因为(\d+)已经包含匹配后面的0,第二部分规则根本没机会
    所以我们要让(\d+)少匹配,让(0*)尽量多匹配,就必须使用非贪婪规则。
    在规则(\d+)后面加?即可表示非贪婪匹配

反向引用

  • 如果我们要把搜索到的指定字符串按规则替换,比如前后各加一个xxxx
1
2
3
4
5
6
7
public class Main{
public static void main(String[] args){
String s = "the quick brown fox jumps over the lazy dog.";
String r = s.replaceAll("\\s([a-z]{4})\\s","<b>$1</b>");
System.out.println(r);
}
}

上述代码运行的结果就是:

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
2
3
4
{
"name":"Bob",
"lang":"Java"
}

最终输出结果为:

1
Hello,Bob!You are learning Java!