RegularExpressions 字符串处理利器
用途:
字符串匹配(字符匹配)
字符串查找
字符串替换
例如
IP地址是否正确
从网页揪出email地址
从网页揪出链接等
类:
Java.lang.String
Java.util.regex.Pattern 有关于正则表达式的构造
Java.util.regex.Matcher
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
//简单认识正则表达式概念
p("ab1".matches("...")); //"."表示任何一个字符 true
p("a3465b".replaceAll("\\d","_")); //"\d"表示一位数字前面的"\"表示转义字符 a____b
Pattern p=Pattern.compile("[a-z]{3}"); //匹配a-z的字符三个
Matcher m=p.matcher("fgh");
p(m.matches()); //true
p("fgh".matches("[a-z]{3}")); //效果相当于上面三行 true
/*初步认识"."" *"" +" (MetaCharacter)
* "."表示一个任何的字符
* "*"表示0个或多个
* "+"表示1个或多个
* "?"表示0个或1个
*/
p(" ");
p("aa".matches(".")); //false
p("aa".matches("a*")); //true
p("aa".matches("a+")); //true
p("aa".matches("a?")); //false
p("123.".matches("\\d{1,3}\\.")); //1-3个数字,一个.号 true
p("192".matches("[0-2][0-9][0-9]")); //true
//范围"[]"
p(" ");
p("a".matches("[abc]")); //abc中的一个 true
p("a".matches("[^abc]")); //除abc外 false
p("a".matches("[a-zA-Z]")); //a-z或A-Z true
p("a".matches("[a-z]|[A-Z]")); //a-z或A-Z true
p("a".matches("[a-z[A-Z]]")); //a-z或A-Z true
p("r".matches("[a-z]&&[rfgh]")); //且 false
/*预定义字符类"\s""\d""\w""\"
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
*/
p(" ");
p(" \n\r\t".matches("\\s{4}")); //true
p(" ".matches("\\S")); //false
p("q_4".matches("\\w{3}")); //true
p("qwe333*&%".matches("[a-z]{3}\\d+[&*%]+")); //true
p("\\".matches("\\\\")); //匹配一个\ true
//POSIX Style
p(" ");
p("a".matches("\\p{Lower}")); //true
/*边界匹配器boundary
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
*/
p(" ");
p("hello sir".matches("^h.*")); //true
p("hello sir".matches(".*ir$")); //true
p("hello sir".matches("^h[a-z]{3}o\\b.*")); //true
p("hellosir".matches("^h[a-z]{3}o\\b.*")); //false
//whilte lines
p(" ");
p(" \n".matches("^[\\s&&[^\\n]]*\\n$")); //true
p(" ");
p("aaa 8888a".matches(".*\\d{4}.")); //true
p("aaa 8888a".matches(".*\\b\\d{4}.")); //true
p("aaa8888a".matches(".*\\d{4}.")); //true
p("aaa8888a".matches(".*\\b\\d{4}.")); //false
//email
p("");
p("asdfgh@aa.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+")); //true
//matches find lookingAt
p("");
Pattern p1=Pattern.compile("\\d{3,5}");
String s="13-45312-134-11";
Matcher m1=p1.matcher(s);
p(m1.matches()); //匹配整个字符串matches()会影响到find() false
m1.reset(); //从头开始读,消除matches()的影响
p(m1.find()); //尝试查找与该模式匹配的下一个子序列 true
p(m1.start()+"-"+m1.end()); //3-8 匹配的起始位置到结束位置的下一个(左闭右开)
p(m1.find()); //true
p(m1.start()+"-"+m1.end()); //9-12
p(m1.find()); //false
p(m1.find()); //false
p("");
p(m1.lookingAt()); //每次都从开头匹配子序列 false
//p(m1.start()+"-"+m1.end()); 不匹配的会报错
p(m1.lookingAt()); //false
p(m1.lookingAt()); //false
p(m1.lookingAt()); //false
//replacement
p("");
Pattern p2 = Pattern.compile("java",Pattern.CASE_INSENSITIVE); //大小写不敏感
Matcher m2 = p2.matcher("java JaVa JAvA thinking in JAVA Javabean asdre");
while(m2.find()) {
p(m2.group()); //返回匹配的子序列
}
p(m2.replaceAll("JAVA")); //将所有类型的java替换成JAVA
/*
java
JaVa
JAvA
JAVA
Java
JAVA JAVA JAVA thinking in JAVA JAVAbean
*/
//双数位置出现用JAVA替换,单数位置用java替换
p(" ");
StringBuffer buf = new StringBuffer();
int i=0;
m2.reset();
while(m2.find()) {
i++;
if(i%2 == 0) {
m2.appendReplacement(buf, "java");
}else {
m2.appendReplacement(buf, "JAVA");
}
}
m2.appendTail(buf); //把后面一串尾巴添加到buf后
p(buf);
// JAVA java JAVA thinking in java JAVAbean asdre
//group
p("");
Pattern p3 = Pattern.compile("(\\d{3,5})([a-z]{2})");//由两个()分为两组
String s3 = "123qq-23456aa-234cc-oo";
Matcher m3 = p3.matcher(s3);
while(m3.find()) {
p(m3.group(1)); //将每个匹配的子序列的第一组输出
}
/*
123
23456
234
*/
//qulifiers(了解即可)
p("");
Pattern p4 = Pattern.compile("(.{3,10})[0-9]");
Matcher m4 = p4.matcher("aaaa5ssss5");
if(m4.find()) {
p(m4.start()+"-"+m4.end()); //Greedy形式一次性读取十个再吐出 0-10
/*reluctant形式:X*? X,零次或多次
* Pattern p4 = Pattern.compile("(.{3,10}?)[0-9]");
* 先读取3个试试,不行再读
* 则输出0-5
*
* Possessive形式:X*+ X,零次或多次
* Pattern p4 = Pattern.compile("(.{3,10}+)[0-9]");
* 一次性读取10个不吐出
* 则输出不匹配
* */
}else {
p("not match!");
}
//non-capturing groups 非捕获组 (了解即可)
p("");
Pattern p5 = Pattern.compile(".{3}(?=a)");//有三个字符,第四个是a(但不捕获a)
String s5 = "123a516b";
Matcher m5 = p5.matcher(s5);
while(m5.find()) {
p(m5.group()); //123 没有捕获a
}
//back refenrence 向前引用
p("");
Pattern p6 = Pattern.compile("(\\d(\\d))\\2"); // \\2表示引用第二个组的匹配
Matcher m6 = p6.matcher("122");
p(m6.matches()); //true
//flags的简写
p("");
//Pattern p7 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)java")); //等同于上面的写法 true
}
public static void p(Object o) {
System.out.println(o);
}
}