正则表达式的基本使用:
package patterntest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
看一下字符类:
[]表示一个字符:
[abc]: abc其中的一个字符。
[a-z]: a-z中的任意一个字符。
[0-9]: 0-9中任意一个数字。
[a-zA-Z]: a-z或者A-Z中任意一个字符。
[^def]: 求补集,不是def中的一个字符。
[a-c[e-g]]: 求并集,即a-c或者e-g中的一个字符。
[a-z&&[def]]: 求交集,即def中的一个字符。
^表示开头,例如:"^abc.*",以“abc”开头的。
$表示结尾,例如:".*xyz$",以“xyz”结尾的。
单个字符的其他表示:
. 任意一个字符。
\d 数字:[0-9]
\D 非数字:[^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
注意:“\小写字母”代表一类字符,“\大写字母”代表相反的字符。
字符串中写“\\” 代表 “\”。一个反斜杆表示转义,两个反斜杆代表一个反斜杠。
数量词:
X? X出现0次或1次,?表示是否有一个。
X* X出现0次或多次,*表示任意个。
X+ X出现1次或多次,+表示至少有一个。
X{n} X恰好出现n次。
X{n,m} X出现n-m次,n和m都包括了。
正则表达式的分组:
捕获组通过数从左到右的开口括号计数编号。在表达((A)(B(C))),例如,有四个这样的团体:
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
零组总是代表整个表达式。
例1:高高兴兴,快快乐乐,这样的叠词怎么匹配?
(.)\1(.)\2 \1表示第一组再出现1次,\2表示第二组再出现1次。
注意:(.)\1+,表示第一组至少出现1次。
$1表示第一组出现的内容。
例2:高兴高兴,快乐快乐,这样的叠词怎么匹配?
(..)\1
例3:将"我..我我....我...我..我我要.要...要..要要..学.学..学..学学.编.编..程..程."
变成:"我要学编程"
String s = "我..我我....我...我..我我要.要...要..要要..学.学..学..学学.编.编..程..程.";
String s2 = s.replaceAll("\\.+", "");
String s3 = s2.replaceAll("(.)\\1+", "$1");
*/
//练习题:
public class Test02 {
public static void main(String[] args) {
// 取出字符串中的三个手机号。
String s = "我的第一个手机号是13511112222,第二个手机号是15722223333,第三个手机号是18733334444。";
Pattern p = Pattern.compile("[1][358][0-9]{9}"); // 获取指定的正则表达式
Matcher m = p.matcher(s); // 获取匹配器
boolean b = m.matches(); // 获取匹配的结果
System.out.println(b); // false 因为原文很长,怎么可能全是这几个数字
while (m.find()) {
int start = m.start();
int end = m.end();
String phone = m.group();
System.out.println("开始下标:" + start + ",结束下标:" + end);
System.out.println("手机号:" + phone);
System.out.println();
}
}
}