http://manual.phpv.net/regular_expression.html(不错的介绍)
强大的字符串处理工具(查找,提取,分隔,替换),
创建正则表达式:
1、方括号表达式
[abc]枚举 [a-f]范围 [^abc]求否 [a-z&&[def]]与 [a-d[m-p]]并
2、圆括号表达式
将多个表达式组成一个表达式。可以用或运算符”|”连接
3、支持的数量标志符模式
Greedy:默认。一直匹配,直至无法进行
Reluctant(勉强模式):用“?”表示,只匹配最少的字符,最小匹配模式
Possessive:“+”表示,很少用到
eg:
String str=”hello//(此处空格)//, java!”;
//贪婪模式
System.out.println(str.repalceFirst(“\w*”,”foo”));//输出foo , java
//勉强模式
System.out.println(str.repalceFirst(“\w*?”,”foo”));//foo hello , java
使用正则表达式:
正则表达式字符串必须被先编译成Pattern对象,之后利用该Pattern对象创建Matcher对象。多个Matcher可共享一个Pattern。执行匹配的结果(true 或 false)保留在 Matcher 对象中。
典型的调用顺序:
Pattern p=Pattern.compile("a*b");
Matcher m=p.matcher("aaaaab");
boolen b=m.matches();//返回ture
若是一次性使用,则可
boolean b=Pattern.matches("a*b","aaaaab");
常用方法:
find():返回目标字符串中是否包含与 Pattern 匹配的子串。
group():返回上一次与 Pattern 匹配的子串。
start():返回上一次与 Pattern 匹配的子串在目标字符串中的开始位置。
end():返回上一次与 Pattern 匹配的子串在目标字符串中的结束位置+1。
lookingAt():返回目标字符串前面部分与 Pattern 是否匹配。
matches():返回整个目标字符串与 Pattern 是否匹配。
reset():将现有的 Matcher 对象应用于一个新的字符序列。
replaceAll()、replaceFirst()、split() 等方法,以利用正则表达式功能实现对字符串的替换和分割。
Pattern、Matcher 类的 CharSequence 接口代表一个字符序列,其中 CharBuffer、String、StringBuffer、StringBuilder 都是它的实现类。简言之,CharSequence 代表一个各种表示形式的字符串。
eg:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Public class FindGroup
{
public static void main(String[] args)
{
Matcher m=Pattern.compile("\\w+").matcher("JAVA is very easy!");
while(m.find())
{
System.out.println(m.group());
}
int i=0;
while(m.find(i))
{
System.out.print(m.group()+"\t");
i++;
}
}
}
贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权
(如何让其只匹配到ab?“最先开始“,那么后续从左往右的表达式就没有懒惰/贪婪的级别高了吧?)