1.概述
1>正则表达式:符合一定规则的表达式
2>作用:用于专门操作字符串。可以简化对字符串的操作。
3>弊端:符号越多,定义越长,不易阅读。
5>常用正则表达式
a>字符类
[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](减去)
b>预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
c>Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
d>边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
2.操作方法
1>匹配:String matches(String regex)方法,用规则匹配整个字符串,只要有一处不符合就匹配结束返回flase。
2>切割:String split(String regex)
为了可以让规则的结果被重复,可以将规则封装成一个组用()完成。组的出现都有编号。从1开始。想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。
例:String str = "qwweffrgggyjjjg";
String reg = "(.)\\1+";//任意字符出现多次
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1--->((A)(B(C))) 2--->\A 3--->(B(C)) 4--->(C)
3>替换:String replaceAll(String regex, String replacement)将字符串中符合规则regex不服替换成另外部分replacement。
4>获取:将字符串中符合规则的子串取出
步骤:a>将正则表达式封装成对象 Pattern p =Pattern.compile(reg)
b>让正则对象和要操作的字符串关联 Matcher m = p.matcher(str);
c>关联后获取正则匹配引擎 先m.find()后m.group()
find():将规则作用到字符串上,并进行符合规则的子串查找。
group():用于获取匹配后结果
d>通过引擎对符合规则的子串进行操作
publicclass RegexDemo {
publicstaticvoid main(String[] args) {
// TODO Auto-generated methodstub
demo();
demo2();
splitDemo("zhangsan,lishi,wangwu",",");
splitDemo("zhangsan.lishi.wangwu","\\.");//注意转义
splitDemo("c:\\abc\\a.txt","\\\\");//注意转义
//按照叠词完成切割。
splitDemo("qwweffrgggyjjjg","(.)\\1+");
//将字符串中连续出现一次或一次以上的数字替换成“*”
replaceAllDemo("wu12gu43u5","\\d{1,}","*");
//将重复字母只保留一个,多余的删除;"$1":获取第一组
replaceAllDemo("qwweffrgggyjjjg","(.)\\1+","$1");
getDemo();
}
publicstaticvoid getDemo()
{
String str = "ads fdfe fds dfdsfd";
String reg = "\\b[a-z]{3}\\b";
//将规则封装成对象
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配对象
Matcher m = p.matcher(str);
while(m.find())
{
System.out.print(m.group()+"\t");
}
System.out.println();
}
publicstaticvoid replaceAllDemo(String str,String reg,String newStr)
{
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
publicstaticvoid demo()
{
String str = "bc";
//定义的规则为第一个字母必须是a或b或c;第二个只能是小写字母
String reg = "[bcd][a-z]";
System.out.println(str.matches(reg));
}
publicstaticvoid demo2()
{
String str = "2123245";
//第一位是1-9,后面有4-14位都是数字
String reg = "[1-9]\\d{4,14}";
System.out.println(str.matches(reg));
}
publicstaticvoid splitDemo(String str,String reg)
{
String[] arr = str.split(reg);
for(String s : arr)
{
System.out.print(s+"\t");
}
System.out.println();
}
}
3.正则的思路
1>如果只想知道该字符是否对错,使用匹配
2>想要按照自己的方式将字符串变成多个字符串,使用切割。获取规则以外的子串
3>要想将已有的字符串变成另一个字符串,使用替换
4>想要拿到符合要求的字符串子串,获取。获取符合规则的子串。