您的位置:首页 > 编程语言 > Java开发

java正则表达式

2008-03-29 23:53 267 查看
正则表达主要用的是java.util.regex 包中的主要两个类
Matcher和Pattern

matches方法用来判断整个字符串有没有匹配

一.Pattern 匹配模式
[a-z]{3} []里是匹配的字符
{}里表示出现的个数

例子:
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("xyz");
System.out.println(m.matches());有没有符合条件

或者直接一句话写
System.out.println("fgh".matches("[a-z]{3}"));
不过效率没有上面的高。

二." . * + ?"特殊字符

. :点表示一个字符
* :星表示0个或多个
+ :加表示一个或多个
? :问号表示0个或一个
[] 表示一个范围内的值,只匹配其中一个
[^]:表示这个范围内的除外匹配
^ :不在[]里的,表示一行的开始
{n}:大括号表示出现的个数
{n,}最少出现n个最多无数个
{n,m}最少出现n个最多出现m个
"":空串表示0次

1.[] 表示一个范围内的值,只匹配其中一个

^:取非 即除此之外的内容
|:或者
&&:并且

例子:
p("a".matches("[abc]"));
p("a".matches("[^abc]")); //不匹配,表示abc除外
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z[A-Z]]"));
p("R".matches("[A-Z&&[RFG]]"));

2.认识/s /w /d /
/s 空白字符
/d 数字字符
/w 由[a-zA-Z_0-9]组成的字符 如:
以上的大写表达即为取非 如/D 非数字字符

例子:
p(" /n/r/t".matches("//s{4}")); //匹配 因为是4个空白字符
p(" ".matches("//S"));  //不匹配S是非空白
p("a_8".matches("//w{3}"));
p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
p("//".matches("////"));  //正则表达式中用/开始,java也要加/,再与前面匹配

3.POSIX风格
p("a".matches("//p{Lower}")

4.边界 开头和结尾
^ :表示开头,不在[]里的表示一行的开始
$ :表示结尾
/b:表示单词边界,一般以空格为边界

p("hello sir".matches("^h.*")); //匹配 表示以h开头,字符有一个或者多个 
p("hello sir".matches(".*ir$")); //匹配 表示字符是一个或多个且要以ir结尾
p("hello sir".matches("^h[a-z]{1,3}o//b.*")); //匹配 有单词边界
p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //不匹配,没有边界
//whilte lines
p(" /n".matches("^[//s&&[^//n]]*//n$")); //空白行:空白且不换行,再出现0到多次,且换行结尾

p("aaa 8888c".matches(".*//d{4}."));
p("aaa 8888c".matches(".*//b//d{4}."));
p("aaa8888c".matches(".*//d{4}."));
p("aaa8888c".matches(".*//b//d{4}."));//不匹配,没有边界

5.Email地址匹配

p("]+@[//w[.-]]+//.[//w]asd_sf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+"));

6.查找匹配字串

Pattern p = Pattern.compile("//d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
p(m.matches()); //读到123-就判断不匹配,再find则从1234-后面的字符查找匹配
m.reset(); //再从头开始
p(m.find());  //条件匹配字串

p(m.lookingAt()) //每次从头开始找
7.start和end 起始位置和结束位置
前提是必须查找到子串

p(m.find());
p(m.start() + "-" + m.end()); 输出0-3

8.字符串的替换
Pattern.CASE_INSENSITIVE表示忽略大小写

Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
while(m.find()) {
//p(m.replaseAll("JAVA")) 把全部有java的替换成大写
i++;
if(i%2 == 0) {//把单数的大写,双数的小写
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); //添加尾巴字符串
p(buf);

9.分组
把正则表达式用()括起来就是分组

Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印所有
p(m.group(1)); //打印数字的
p(m.group(2)); //打印字母的
}

三.正则表达式的高级部分
1.quantifier数量词 有三种情况

Greedy 数量词
正常的正则表达式,从最大值开始
如{2,10},先从10开始,不匹配从后减少至匹配输出
Reluctant 数量词(懒惰)
表达式后加 ?
从最小值开始
如{2,10},先从2开始,不匹配从头开始增加至匹配输出
Possessive 数量词(独占)
表达式加 +
也是从最大值开始,不过不匹配不减少。直接退出

2.non-capturing groups (非捕获组)

加(?=X):即不捕获X 
用法:放在前面算在其中,放在后天不算在其中

例:
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印输出444因为它不捕获a
}

3.向后引用
(组)//n 即前面找到组的第n个组,要和后面剩下的匹配

Pattern p = Pattern.compile("(//d(//d))//2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches()); //匹配,因为前面找到的第二个级是2和后面剩下的2匹配

4.flags的简写

?i :打开大小写忽略,相当于加入Pattern.CASE_INSENSITIVE
例:
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
    p("Java".matches("(?i)(java)"));和上面实现的功能一样。

正则表达主要用的是java.util.regex 包中的主要两个类
Matcher和Pattern

matches方法用来判断整个字符串有没有匹配

一.Pattern 匹配模式
[a-z]{3} []里是匹配的字符
{}里表示出现的个数

例子:
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("xyz");
System.out.println(m.matches());有没有符合条件

或者直接一句话写
System.out.println("fgh".matches("[a-z]{3}"));
不过效率没有上面的高。

二." . * + ?"特殊字符

. :点表示一个字符
* :星表示0个或多个
+ :加表示一个或多个
? :问号表示0个或一个
[] 表示一个范围内的值,只匹配其中一个
[^]:表示这个范围内的除外匹配
^ :不在[]里的,表示一行的开始
{n}:大括号表示出现的个数
{n,}最少出现n个最多无数个
{n,m}最少出现n个最多出现m个
"":空串表示0次

1.[] 表示一个范围内的值,只匹配其中一个

^:取非 即除此之外的内容
|:或者
&&:并且

例子:
p("a".matches("[abc]"));
p("a".matches("[^abc]")); //不匹配,表示abc除外
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z[A-Z]]"));
p("R".matches("[A-Z&&[RFG]]"));

2.认识/s /w /d /
/s 空白字符
/d 数字字符
/w 由[a-zA-Z_0-9]组成的字符 如:
以上的大写表达即为取非 如/D 非数字字符

例子:
p(" /n/r/t".matches("//s{4}")); //匹配 因为是4个空白字符
p(" ".matches("//S"));  //不匹配S是非空白
p("a_8".matches("//w{3}"));
p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
p("//".matches("////"));  //正则表达式中用/开始,java也要加/,再与前面匹配

3.POSIX风格
p("a".matches("//p{Lower}")

4.边界 开头和结尾
^ :表示开头,不在[]里的表示一行的开始
$ :表示结尾
/b:表示单词边界,一般以空格为边界

p("hello sir".matches("^h.*")); //匹配 表示以h开头,字符有一个或者多个 
p("hello sir".matches(".*ir$")); //匹配 表示字符是一个或多个且要以ir结尾
p("hello sir".matches("^h[a-z]{1,3}o//b.*")); //匹配 有单词边界
p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //不匹配,没有边界
//whilte lines
p(" /n".matches("^[//s&&[^//n]]*//n$")); //空白行:空白且不换行,再出现0到多次,且换行结尾

p("aaa 8888c".matches(".*//d{4}."));
p("aaa 8888c".matches(".*//b//d{4}."));
p("aaa8888c".matches(".*//d{4}."));
p("aaa8888c".matches(".*//b//d{4}."));//不匹配,没有边界

5.Email地址匹配

p("]+@[//w[.-]]+//.[//w]asd_sf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+"));

6.查找匹配字串

Pattern p = Pattern.compile("//d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
p(m.matches()); //读到123-就判断不匹配,再find则从1234-后面的字符查找匹配
m.reset(); //再从头开始
p(m.find());  //条件匹配字串

p(m.lookingAt()) //每次从头开始找
7.start和end 起始位置和结束位置
前提是必须查找到子串

p(m.find());
p(m.start() + "-" + m.end()); 输出0-3

8.字符串的替换
Pattern.CASE_INSENSITIVE表示忽略大小写

Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
while(m.find()) {
//p(m.replaseAll("JAVA")) 把全部有java的替换成大写
i++;
if(i%2 == 0) {//把单数的大写,双数的小写
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); //添加尾巴字符串
p(buf);

9.分组
把正则表达式用()括起来就是分组

Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印所有
p(m.group(1)); //打印数字的
p(m.group(2)); //打印字母的
}

三.正则表达式的高级部分
1.quantifier数量词 有三种情况

Greedy 数量词
正常的正则表达式,从最大值开始
如{2,10},先从10开始,不匹配从后减少至匹配输出
Reluctant 数量词(懒惰)
表达式后加 ?
从最小值开始
如{2,10},先从2开始,不匹配从头开始增加至匹配输出
Possessive 数量词(独占)
表达式加 +
也是从最大值开始,不过不匹配不减少。直接退出

2.non-capturing groups (非捕获组)

加(?=X):即不捕获X 
用法:放在前面算在其中,放在后天不算在其中

例:
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印输出444因为它不捕获a
}

3.向后引用
(组)//n 即前面找到组的第n个组,要和后面剩下的匹配

Pattern p = Pattern.compile("(//d(//d))//2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches()); //匹配,因为前面找到的第二个级是2和后面剩下的2匹配

4.flags的简写

?i :打开大小写忽略,相当于加入Pattern.CASE_INSENSITIVE
例:
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
    p("Java".matches("(?i)(java)"));和上面实现的功能一样。

总结:这样应该算挺全的吧。。要是还有没写到的。也许就是我自己没学到的吧。。原谅一下。。哈。

原文出处 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1575748
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: