Java正则表达式
一、概念
正则表达式是一种文本处理工具,通常用来检索、替换某个符合规则或者模式的文本。
二、字符串中的使用
1.通过String的matches()方法可以验证一个字符串是否匹配某个正则表达式(返回值,boolean),常用于检查某个字符串是否符合特定规则。
2.split()方法可以将字符串从正则表达式匹配的位置截取为字符串数组。
3.replaceFirst()和replaceAll()分别替换正则表达式第一个匹配的字串或者替换整个字串String中所有匹配正则表达式的内容。
三、语法
1.元字符
|
元字符 |
Java正则写法 |
意义 |
|
. |
. |
匹配除”\r\n”之外的任何单个字符 |
|
\d |
\\d |
匹配任意数字,等价于[0-9] |
|
\D |
\\D |
匹配非数字字符,等价于[^0-9] |
|
\s |
\\s |
匹配空格字符,等价于[\f\n\r\t\v] |
|
\S |
\\S |
匹配非空格字符 |
|
\w |
\\w |
匹配单词类字符,等价于[A-Za-z0-9_] |
|
\W |
\\W |
匹配非单词类字符 |
|
^ |
^ |
匹配字符串开始位置 |
|
$ |
$ |
匹配字符串结束位置 |
2.组合元字符
|
字符组 |
意义 |
|
[abc] |
匹配a、b、c中的任何一个字符 |
|
[^abc] |
匹配除a、b、c以外的任何字符 |
|
[a-zA-Z] |
匹配任意一个英文字母 |
|
[a-d] |
匹配a至d的任意一个字母 |
|
[a-d[x-z]] |
并(或)运算,匹配a、b、c、d或x、y、z中任意一个 |
|
[a-z&&[x-z]] |
交(与)运算,匹配x、y、z |
|
[a-f&&[^bc]] |
差运算,匹配a、d、e、f |
3.量词
|
量词格式 |
意义 |
|
X? |
表达式X出现0次或1次,等价于{0,1} |
|
X* |
表达式X出现0次或多次,等价于{0,} |
|
X+ |
表达式X出现1次或多次,等价于{1,} |
|
X{n} |
表达式X正好出现n次 |
|
X{n,} |
表达式X至少出现n次 |
|
X{n,m} |
表达式X出现n次至m次 |
四、常用类及其方法
1.Pattern和Matcher类
Pattern类的对象用于完成正则表达式的编译处理,使用静态方法: Pattern.compile(正则表达式)完成将正则表达式处理为模板的过程。
Matcher类的对象用于根据pattern正则表达式模板对输入字符串进行解释和匹配,
Matcher matcher = p.matcher(“输入字符串”)。
2.常用方法操作
matcher.find()方法尝试匹配搜索输入字符串中符合模板的下一个子串,
matcher.group()方法获取匹配到的组,
通常用法:用 (.*?) 或者 (.+?) 来匹配表示要取的部分内容,表达式 a(.*?)b 用group(0)获取完整表达式,用group(1)查找.*?中的分组内容,
例子:
1 public class PatternMatcherTest { 2 public static void main(String[] args) { 3 // 场景:从一串字符串中,按照规则提取相应的内容 4 String dg = "<a target=\" _blank \" href=\"www.51job.com/dongguan/\">东莞</a>"; 5 String dl = "<a target=\" _blank \" href=\"www.51job.com/dalian/\">大连</a>"; 6 String kk = "<a target=\" _blank \" href=\"www.51job.com/dalian/\"></a>"; 7 8 // 制定规则,去查找对应的内容。 规则> 内容 </a> 9 // 模式类Pattern 10 // 获取地名 11 Pattern city = Pattern.compile(">(.*?)</a>"); 12 // 获取URL和地名 <.*href(.*?)>(.*?)</a> 13 Pattern URL_city = Pattern.compile("<.*href=\\W(.*?)\\W>(.*?)</a>"); 14 // 匹配类Matcher 15 Matcher dg_matcher = city.matcher(dg); 16 Matcher dl_matcher = city.matcher(dl); 17 Matcher dg_URL_matcher = URL_city.matcher(dg); 18 if (dg_matcher.find()) { 19 System.out.println("完整的结果是" + dg_matcher.group(0)); 20 System.out.println("只包含想要的结果是" + dg_matcher.group(1)); 21 } 22 if (dg_URL_matcher.find()) { 23 System.out.println("完整的结果是" + dg_URL_matcher.group(0)); 24 System.out.println("URL:" + dg_URL_matcher.group(1) + "\r\n" + "城市:" + dg_URL_matcher.group(2)); 25 } 26 } 27 }
输出为:

3.贪婪 和非贪婪匹配:
贪婪匹配():匹配到最后才结束;
非贪婪匹配:匹配到一个就结束。
例子:
1 public class EagerMatchTest { 2 public static void main(String[] args) { 3 String s = "<a>xxx</a> <a>zzz</a>"; 4 // 贪婪 5 Pattern eager = Pattern.compile("<a>(.*)</a>"); 6 // 非贪婪 7 Pattern unEager = Pattern.compile("<a>(.*?)</a>"); 8 Matcher eagerMatcher = eager.matcher(s); 9 Matcher uneagerMatcher = unEager.matcher(s); 10 if (eagerMatcher.find()) { 11 System.out.println("贪婪模式:" + eagerMatcher.group(1)); 12 } 13 if (uneagerMatcher.find()) { 14 System.out.println("非贪婪模式:" + uneagerMatcher.group(1)); 15 } 16 17 } 18 }
输出为:


浙公网安备 33010602011771号