正则表达式经典学习总结

来源:互联网 发布:淘宝怎么给别人代付 编辑:程序博客网 时间:2024/05/16 09:45

现在在CSDN上经常看到正则表达式的文章。感觉很多人开始在关注它了。自己以前学的笔记吧。拿出来献献丑了。

正则表达主要用的是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("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)"));和上面实现的功能一样。
 

 

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

原创粉丝点击