本文概览:介绍了正则表达式常用符号含义和java使用正则表达式实例。
1 正则表达式
1、常用符号含义
2. 解析上面的符号
(1) 句号点
表示任意一个字符
(2)方括号[]
只能表示一个字符,举例如[abc]表示:a或者b或者c。
(3)或 |
和[]比较,“|”支持字符串。
如正则表达式:t(a|e|oo)n,此时就可以匹配tan、ten、toon。
又如\d{5}-\d{4}|\d{5}这个表达式规则是5位数字,或者用连字号间隔的9位数字。
注意:如果把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
(4)否
“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。所以这里一定要需要加上[ ]。如下:
1 |
[^x],表示是第一个字符不能是'x'。 |
(5)常用符号
/w,表示的是[a-z,A-Z,0-9_],即:字母、数字和下划线。
/W, 表示对/w取否。
(6)表示匹配次数的符号
这些符号作用是确定紧靠该符号左边的符号的出现次数,如下图:
2 JAVA使用一个实例
1、查找匹配的字符串
通过find和group方法来实现。
(1)举例如下:
1 2 3 4 5 6 7 8 9 |
public void test{ String input = "hadoop,lucene,lu3e,elk"; String regex = "lu[a-z0-9]e"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println(matcher.group()); } } |
执行结果为
luce
lu3e
(2)group作用
通过find()获取到匹配的字符串,如上面的“luce”和”lu3e”。但是有时候我们想要获取上面正则表达式“lu[a-z0-9]e”中”lu”和”e”之间那个匹配的字符,此时就需要分组了,改下正则表达式为“lu([a-z0-9])e”。
2、find()和matches()比较
find()是指包含的某一个字符串;matches表示正则表达式可以匹配整个字符串。如下代码
1 2 3 4 5 6 7 8 9 10 11 |
public void testMatch(){ Pattern p = Pattern.compile("\\D12月"); Matcher m = p.matcher("百安12月20170712"); // matchs表示完全匹配,此时应该返回false System.out.println(m.matches()); // find表示包含,所以此时返回ture System.out.println(m.find()); } |
执行结果为
1 2 3 |
false true |
关于match是完全匹配的解释,如下代码,正则表达式”\\d\\d\\d”表示三个数字,与“123”完全匹配,如果是“1234”,则就不是完全匹配了,因为“1234”是四个数字。
1 2 3 4 5 6 |
public void testMatch(){ // 匹配整个字符串 Pattern p = Pattern.compile("\\d\\d\\d"); Matcher m =p.matcher("123"); System.out.println(m.matches()); } |
返回结果为 true。
3 java使用的一些总结
1、 grop 和 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * 使用 '或|' 和 分组 */ public void testHuoAndGroup(){ String input = ",1862345678912345890,1234567891234888,589"; String regex = "[^\\d](\\d{16})[^\\d]|[^\\d](\\d{19})[^\\d]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while(matcher.find()) { System.out.println("count=" + matcher.groupCount()); System.out.println("group(0)=" + matcher.group()); System.out.println("group(1)="+matcher.group(1)); System.out.printf("group(2)="+matcher.group(2)); } } |
结果为:
count=2
group(0)=,1862345678912345890,
group(1)=null
group(2)=1862345678912345890
(1)此时为什么 count都是2?
如下正则表达式,尽管有一个“|”,但是应该当成一个表达式,因为此时表达式中有2个分组。所以此时groupCount =2。
(2)为什么group(1) = null
因为上面是匹配到了“[^\d](\d{19})[^\d]”,这个规则是第二个分组,所以group(2)是有值的,但是group(1)是没有值的。
(3)为什么没有匹配到”[^\d](\d{16})[^\d]”
1 |
自作向右的匹配输入的字符串,如果某一个字符被匹配到某一个规则,那么这个字符就不能被使用了 |
如“,1862345678912345890 , 1234567891234888,589” 中红颜色的逗号首先被匹配到了, 所以就不能再被其他规则使用了。我们还可以举个例子来说明如下
1 2 3 4 5 6 7 8 9 10 |
public void testGroup(){ String input = ",1862-34-5678912345890,1234567891234888,589"; String regex = "(\\d{4})-(\\d{2}-(\\d\\d))|,(\\d{2})"; pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while(matcher.find()) { System.out.println("count=" + matcher.groupCount()); System.out.println("group(0)=" + matcher.group()); } } |
返回结果为
count=4
group(0)=,18
count=4
group(0)=,12
count=4
group(0)=,58
此时没有匹配到 1862-34-56 ?
这是因为上”,1862-34-56…”中“,18”首先匹配到“,\d{2}”这个规则,所以’,18’就不能再匹配'(\\d{4})-(\\d{2}-(\\d\\d))’这个规则了。如果把这个逗号去掉即“1862-34….”此时执行结果为
count=4
group(0)=1862-34-56group(1)=null
count=4
group(0)=,12group(1)=12
count=4
group(0)=,58group(1)=58
4 常用正则表达式
1、匹配6-10的数字
1 |
^([6-9]|10)$ |
注意:要加上开始和结尾符号,否则类似110这样数字也会匹配到10这个数字。
5 参考文献
1、http://www.jb51.net/tools/zhengze.html#charclass
(全文完)