package lib;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp {
public static void main(String[] args) {
/**
数量:
. 任何字符(与行结束符可能匹配也可能不匹配)
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
*/
System.out.println("a".matches("."));
System.out.println("aa".matches("aa"));
System.out.println("aaaaaa".matches("a*"));
System.out.println("".matches("a*"));
System.out.println(" ".matches("a*"));//不匹配一个空格, false
System.out.println("aaaaaa".matches("a+"));
System.out.println("".matches("a+"));//false
System.out.println("aaaaaa".matches("a?"));//false
System.out.println("".matches("a?"));
System.out.println("a".matches("a?"));
System.out.println("3413413413415".matches("\\d{3,100}"));
System.out.println("192.168.0.107".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));
System.out.println("192".matches("[0-9][0-9][0-9]"));
/**
范围:
[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](减去)
*/
System.out.println("a".matches("[abc]"));
System.out.println("a".matches("[^abc]"));//false
System.out.println("A".matches("[^abcB-Z]"));
System.out.println("A".matches("[a-z]|[A-Z]"));
System.out.println("A".matches("[a-z[A-Z]]"));
System.out.println("R".matches("[A-Z&&[RMN]]"));
/**
* 预定义字符
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
*/
System.out.println(" \n\r\t".matches("\\s{4}"));
System.out.println("a".matches("\\S"));
System.out.println("a_8".matches("\\w{3}"));
System.out.println("adf3452&^%".matches("\\w{3}\\d+[%^&]+"));
System.out.println("\\".matches("\\\\"));
/**
* 边界:
^ 行的开头
$ 行的结尾
\b 单词边界
*/
System.out.println("hello world".matches("^h.*"));
System.out.println("hello world".matches(".*ld$"));
System.out.println("hello world".matches("^h[a-z]{1,3}o\\b.*"));
System.out.println("helloworld".matches("^h[a-z]{1,3}o\\\\b.*"));//false
//匹配空白行
System.out.println(" \n".matches("^[\\s&&[^\\n]]*\\n$"));
/**
* find
* lookingat
*/
Pattern p2 = Pattern.compile("\\d{3,5}");
String s = "123-1534-234-90";
Matcher m2 = p2.matcher(s);
System.out.println(m2.matches());//false
System.out.println(m2.find());
System.out.println(m2.start() + "-" + m2.end());//4-8
m2.reset();
System.out.println(m2.find());
System.out.println(m2.start() + "-" + m2.end());//0-3
System.out.println(m2.find());
System.out.println(m2.start() + "-" + m2.end());//4-8
System.out.println(m2.find());
System.out.println(m2.start() + "-" + m2.end());//9-12
System.out.println(m2.find());//false
//每次都从头开始匹配
System.out.println(m2.lookingAt());
System.out.println(m2.start() + "-" + m2.end());//0-3
System.out.println(m2.lookingAt());
System.out.println(m2.start() + "-" + m2.end());//0-3
System.out.println(m2.lookingAt());
System.out.println(m2.start() + "-" + m2.end());//0-3
/**
* 替换
*/
Pattern p3 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
String str = "java java JAVA JAVa test_JAVA other";
Matcher m3 = p3.matcher(str);
int i = 0;
StringBuffer sb = new StringBuffer();
while(m3.find()) {
i++;
if(i%2 == 0) {
m3.appendReplacement(sb, "python");
}else {
m3.appendReplacement(sb, "scala");
}
}
m3.appendTail(sb);
System.out.println(sb);
System.out.println("JAVA".matches("(?i)(java)"));
/*
* 分组 group
*/
Pattern p4 = Pattern.compile("((\\d{3,5})([a-z]{2}))");
String s4 = "123aa-1534bb-234ss-90xx";
Matcher m4 = p4.matcher(s4);
while(m4.find()) {
System.out.println(m4.group(3));
}
/*
* 不捕获分组
*/
Pattern pt = Pattern.compile(".{3}(?=a)");
Matcher mt = pt.matcher("444a333b");
while(mt.find()) {
System.out.println(mt.group());//444
}
/**
* 向前引用
*/
Pattern pt3 = Pattern.compile("(\\d\\d)\\1");//1代表匹配第几个组的内容
Matcher mt3 = pt3.matcher("1212");
System.out.println(mt3.matches());
Pattern pt4 = Pattern.compile("(\\d(\\d))\\2");//匹配第2个组的内容
Matcher mt4 = pt4.matcher("122");
System.out.println(mt4.matches());
/*
* qulifiers
*/
Pattern p5 = Pattern.compile("(.{3,10})[0-9]");//{3,10}与[0,9]同时满足时的最大串情况
String s5 = "aaaa3bbbb2";
Matcher m5 = p5.matcher(s5);
if (m5.find()) {
System.out.println(m5.start()+"-"+m5.end());//0-10
}
Pattern p6 = Pattern.compile("(.{3,10}?)[0-9]");//{3,10}与[0,9]同时满足时的最小串情况
String s6 = "aaaa3bbbb2";
Matcher m6 = p6.matcher(s6);
if (m6.find()) {
System.out.println(m6.start()+"-"+m6.end());//0-5
}
Pattern p7 = Pattern.compile("(.{3,10}+)[0-9]");//{3,10}与[0,9]先要满足左边最大条件,然后满足右边条件
String s7 = "aaaa3bbbb2";
Matcher m7 = p7.matcher(s7);
if (m7.find()) {
System.out.println(m7.start()+"-"+m7.end());
}
}
}