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 }

  输出为:

 

posted @ 2021-06-04 20:45  夜白Night  阅读(176)  评论(0)    收藏  举报