----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
正则表达式是用来简化对字符串的操作的。
1、java.util.regex包中的类
public final class java.util.regex.Pattern该类的构造器是私有的,既不能被继承,也不能用new的方式建立一个Pattern对象
用String写字符串,而后需要将该String编译为该类的实例
用到方法:static Pattern compile(String string),该方法返回一个Pattern(模式)
可用这个Pattern创建一个Matches对象,用方法:Matcher matcher(CharSequence input)
CharSequence是一个接口,String实现了该接口,这里输入input
多个匹配器可以共享同一个模式
该方法将字符串编译成为一种模式,并返回这种模式
经典的调用顺序:
Pattern p = Pattern.compile("dasfas");
Matcher m = p.matcher("C:\\test.txt");//此处为多态,CharSequence对象指向了String实例
boolean b = m.matches();
如果该模式只是用一次可以用一下方式简写:
boolean b = Pattern.matches("dasff","C:\\test.txt");
2、String类中使用正则表达是的方法:
String replaceAll(String regex, String replacement)
str.replaceAll(regx, repl)等价于:
Pattern.compile(regx).matcher(str).replaceAll(repl)
regx是规则表达式(表示要替换的内容),str是待替换的目标,repl是要替换成的内容
String replaceFirst(String regex, String replacement)
使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
String[] split(String regx)
String[] split(String regx, int limit)
limit限制分割后的String[]的长度,当达到该长度后后面的内容不再split直接作为一个字符串存储在该String[]中
3、正则表达式的语法:
. 任何字符
\d 数字
\D 非数字
\s 空白字符[\t\n\x0B\f\r]
\S 非空白字符
\w 单词字符[a-zA-Z_0-9]
\W 非单词字符
3.2 边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界\b(abc)表示单词的开始或结束包含abc
\B 非单词边界\B(abc)表示单词的中间包含abc
\A 输入的开头
\G 上一个匹配的结尾,例如\\Gdog表示在上一个匹配结尾处查找dog如果没有的话则从开头查找,注意如果开头不是dog则不能匹配。
\Z 输入的结尾
3.3 Greedy数量词
X? X,一次或一次也没有(0-1次)
X* X,零次或多次(>0次)
X+ X,一次或多次(>1次)
X{n} X,恰好n次
X{n,} X,至少n次
X{n,m} X,n-m次
3.4 Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
在进行模糊匹配时,greedy第一次就读入整个被模糊匹配的字符串。如果第一个匹配尝试(整个输入字符串)失败,匹配器就会在被匹配字符串中的最后一位后
退 一个字符并且再次尝试,重复这个过程,直到找到匹配或者没有更多剩下的字符可以后退为止。
如:.{3-10}[0-9],greedy先匹配10个而后逐个递减,知道match或者减到3个仍没有结果
除此之外还有Reluctant,Possessive
Greedy 递减
Reluctant 递增
Possessive 仅查询一次,匹配最大长度
3.5 Logical运算符
XY X后面是Y
X|Y X或Y
(X) X,作为捕捉组
Back引用
\n n表示具体的数字
如:(ab)34(cd)\1\2表示:ab34abcd
举例7:表达式 "¥(\\d+\\.?\\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5"
正则表达式认识\d, \.
但\在字符串中也有特殊意义,因此要加一个\,以保证\d和\.能够传递到正则表达式
3.6 预搜索,不匹配
如边界匹配器,^,$,\b等本身并不匹配任何字符,但是对要匹配的字符加了限定条件
更灵活的表达方式:
正向预搜索:"(?=xxxxx)","(?!xxxxx)"
例:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字
样则不被匹配。
即限定Windows后面跟的必须是NT|XP,但匹配的仍然能是Windows,NT|XP本身并不匹配
反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"
例:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。