String r = "\\d{11}"; //匹配11位数字
String regex = "20\\d\\d"; //匹配20开头的四位数字
System.out.println("2015".matches(regex)); //true
System.out.println("20154".matches(regex)); //false
System.out.println("2115".matches(regex)); //false
System.out.println("18436527894".matches(r)); //true
System.out.println("s84365278945".matches(r)); //false
String r2 = "a\\&c"; // \\&相当与\&即转义字符
System.out.println("a&c".matches(r2)); //true
// . 表示可以匹配任何字符
System.out.println("a b".matches("a.b")); //true
//\w可以匹配一个字母、数字或下划线
System.out.println("ab_".matches("ab\\w"));// true
System.out.println("ab5".matches("ab\\w")); //true
System.out.println("abT".matches("ab\\w")); //true
//\s可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用\t表示)
System.out.println("a c".matches("a\\sc")); // true
System.out.println("a\tc".matches("a\\sc")); //true
//用\d可以匹配一个数字,而\D则匹配一个非数字
System.out.println("abc".matches("a\\Dc")); //true
//类似的,\W可以匹配\w不能匹配的字符,\S可以匹配\s不能匹配的字符,这几个正好是反着来的。
//修饰符*可以匹配任意个字符,包括0个字符
System.out.println("abc".matches("a\\w*"));// true
System.out.println("abc".matches("a\\d*"));// false
System.out.println("a".matches("a\\w*")); //true
//修饰符+可以匹配至少一个字符
System.out.println("a".matches("a\\w+")); //false
//修饰符?可以匹配0个或一个字符
System.out.println("a".matches("a\\w?")); //true
System.out.println("ab".matches("a\\w?")); //true
System.out.println("abd".matches("a\\w?")); //false
//如果我们想精确指定n个字符怎么办?用修饰符{n}就可以
System.out.println("abs".matches("a\\w{2}")); //true
/**请编写一个正则表达式匹配国内的电话号码规则:3~4位区号加7~8位电话,中间用-连接,例如:010-12345678。**/
String re = "0\\d{2,3}-[1-9]\\d{6,7}?";
System.out.println("010-12345678".matches(re)); //true
//A{2,} 至少n个字符
System.out.println("abdc".matches("a\\w{2,}")); //true
//A{0,n} 最多n个字符
System.out.println("anc".matches("a\\w{0,1}")); //false
//匹配开头和结尾,用正则表达式进行多行匹配时,我们用^表示开头,$表示结尾。例如,^A\d{3}$,可以匹配"A001"、"A380"。
System.out.println("abc124".matches("^\\w{3}\\d{3}$")); //true
//使用[...]可以匹配范围内的字符,如下匹配1-9的数字
System.out.println("0".matches("[123456789]")); //false
System.out.println("0".matches("[1-9]")); //false
System.out.println("abc".matches("a[a-t][b-t]")); //true
//比如1A2b3c,我们可以这样写:[0-9a-fA-F]
System.out.println("1aAeff".matches("[0-9a-fA-F]{6}"));//true
//[...]还有一种排除法,即不包含指定范围的字符。
System.out.println("abc".matches("[^1-9]{3}"));//true
System.out.println("a0c".matches("[^1-9]{3}"));//true
System.out.println("a2c".matches("[^1-9]{3}")); //true
//用|连接的两个正则规则是或规则,例如,AB|CD表示可以匹配AB或CD
String re1 = "java|php";
System.out.println("java".matches(re1));//true
System.out.println("php".matches(re1));//true
System.out.println("go".matches(re1));//true
//想要匹配字符串learn java、learn php和learn go,用(...)把子规则括起来表示成learn\\s(java|php|go)。
分组匹配
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
pattern.matcher("010-12345678").matches(); // true
pattern.matcher("021-123456").matches(); // false
pattern.matcher("022#1234567").matches(); // false
// 获得Matcher对象:
Matcher matcher = pattern.matcher("010-12345678");
if (matcher.matches()) {
String whole = matcher.group(0); // "010-12345678", 0表示匹配的整个字符串
String area = matcher.group(1); // "010", 1表示匹配的第1个子串
String tel = matcher.group(2); // "12345678", 2表示匹配的第2个子串
System.out.println(area);
System.out.println(tel);
}
}
}
要让\d+尽量少匹配,让0*尽量多匹配,我们就必须让\d+使用非贪婪匹配。在规则\d+后面加个?即可表示非贪婪匹配
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d+?)(0*)");
Matcher matcher = pattern.matcher("1230000");
if (matcher.matches()) {
System.out.println("group1=" + matcher.group(1)); // "123"
System.out.println("group2=" + matcher.group(2)); // "0000"
}
}
}
分割字符串:String.split()
搜索子串:Matcher.find()
替换字符串:String.replaceAll()
"a b c".split("\\s"); // { "a", "b", "c" }
"a b c".split("\\s"); // { "a", "b", "", "c" }
"a, b ;; c".split("[\\,\\;\\s]+"); // { "a", "b", "c" }
String s = "the quick brown fox jumps over the lazy dog.";
Pattern p = Pattern.compile("\\wo\\w");
Matcher m = p.matcher(s);
while (m.find()) {
String sub = s.substring(m.start(), m.end());
System.out.println(sub);
}