1.概述
1.1 预定义字符类
符号 | 说明 |
---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
|转义字符,比如”\”匹配”\” ,”{“匹配”{“。
1.2 数量词
符号 | 说明 |
---|
* | {0,},匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配“z”以及“zoo”;正则表达式“.*”意味着能够匹配任意字符串。 |
+ | 等价于{1,},匹配前面的子表达式一次或多次。例如正则表达式9+匹配9、99、999等。 |
? | 等价于{0,1},匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。此元字符还有另外一个用途,就是表示非贪婪模式匹配,后边将有介绍 |
{n} | 匹配确定的 n 次。例如,“e{2}”不能匹配“bed”中的“d”,但是能匹配“seed”中的两个“e”。 |
{n,} | 至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。 |
{n,m} | 最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。 |
1.3 边界匹配符号
符号 | 说明 |
---|
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
1.4 其它常用符号
符号 | 说明 |
---|
[] | 匹配括号中的任何一个字符 |
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
符号 | 说明 |
---|
()的使用 | 组 |
() | 将()之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。捕获组可以通过从左到右计算其开括号来编号。 |
(\d) | 第一组 |
((A)(B(C))) | 第一组 ((A)(B(C))) 第二组 (A) 第三组(B(C)) 第四组(C) |
2.示例
public class TestRegex {
public static void main(String[] args) {
testMatch_email();
testMatch_StartAndEnd();
testMatchChar1();
testMatchChar2();
testGroup();
testReplace();
testSplit();
testLookAt();
commonRegex();
}
public static void testMatch_email() {
String regex = "([a-zA-Z0-9_-]|[.])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+";
Pattern p = Pattern.compile(regex);
String email = "2111@qq.com";
Matcher m = p.matcher(email);
boolean matchesResult = m.matches();
System.out.println("matchesResult->" + matchesResult);
String email2 = "2111#qq.com";
Matcher m2 = p.matcher(email2);
boolean matchesResult2 = m2.matches();
System.out.println("matchesResult2->" + matchesResult2);
}
public static void testMatch_StartAndEnd(){
String str = "testhascharhastest";
String regex = "^t\\w*t$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
boolean matchesResult = m.matches();
System.out.println("matchesResult2->" + matchesResult);
}
public static void testMatchChar1() {
String str = "testhascharhastest";
String regex = "has\\w{1}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
boolean isHas = matcher.find();
System.out.println("isHas-2-1->" + isHas);
while (matcher.find()) {
String matcherStr = matcher.group();
System.out.println("matcherStr->" + matcherStr + ",start:" + matcher.start() + "-" + matcher.end());
}
}
public static void testMatchChar2(){
String str="<table><tr><td>hello world</td><td>hello regex</td></tr></table>";
System.out.println("====贪婪模式=====");
String regex = "<td>.*</td>";
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("====非贪婪模式=====");
String regex2 = "<td>.*?</td>";
p=Pattern.compile(regex2);
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
}
public static void testGroup(){
String str = "Hello,World! in Java.";
Pattern pattern = Pattern.compile("W(or)(ld!)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println("Group 0:"+matcher.group(0)+",Start:"+matcher.start(0)+" End:"+matcher.end(0));
System.out.println("Group 1:"+matcher.group(1)+",Start:"+matcher.start(1)+" End:"+matcher.end(1));
System.out.println("Group 2:"+matcher.group(2)+",Start:"+matcher.start(2)+" End:"+matcher.end(2));
System.out.println(str.substring(matcher.start(0),matcher.end(1)));
}
}
public static void testReplace(){
String str = "a1b2c34d56e78f90g11h12i23j34k45l56m67n";
String regex = "\\d*";
String str2 = str.replaceAll(regex, "");
System.out.println("str2->"+str2);
}
public static void testSplit(){
String str = "a1b2c34d56e78f90g";
String regex = "\\d+";
String[] strArray = str.split(regex);
for(int i=0;i<strArray.length;i++){
System.out.println("->"+strArray[i]);
}
}
public static void testLookAt(){
Pattern p = Pattern.compile("\\d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
System.out.println(m.matches());
m.reset();
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
}
public static void commonRegex(){
String REGEX_USERNAME = "^[a-zA-Z]\\w{5,20}$";
String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,20}$";
String REGEX_MOBILE = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
String REGEX_CHINESE = "^[\u4e00-\u9fa5],{0,}$";
String REGEX_ID_CARD = "(^\\d{18}$)|(^\\d{15}$)";
String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
}