java正则表达式

来源:互联网 发布:软件项目中标通知书 编辑:程序博客网 时间:2024/05/23 01:14

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

 

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

 

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

原文出处 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1575748

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 性比价是什么意思 性价 哪个牌子的表性价比高 什么马桶好用性价比高 电脑哪个牌子性价比高 婴儿推车哪个性价比高 哪个牌子电脑性价比高 三星哪款手机性价比高 现在那些手机性价比高 哪个品牌空调性价比高 哪个牌子的拉杆箱性价比高 瓷砖哪个牌子的性价比比较好 什么牌子的羽毛球拍性价比高 什么牌子的蓝牙耳机性价比高 男士钱包什么牌子性价比高 抽油烟机哪个牌子性价比高 液晶电视什么牌子性价比高 哪个牌子的油烟机性价比高 森海塞尔哪款耳机性价比高 哪个牌子的平板性价比高 蓝牙耳机什么牌子性价比高 什么牌子的充电宝性价比高 哪个牌子的按摩椅性价比高 机械键盘什么牌子性价比高 什么牌子台式电脑性价比高 哪个牌子的电动车性价比高 什么牌子的机械键盘性价比高 跑步机哪个牌子的性价比高 现在买什么电视性价比高 哪个牌子的粉底液性价比高 thinkpad哪个系列性价比高 什么牌子的平板电脑性价比高 什么牌子固态硬盘性价比高 哪个牌子的羽绒服性价比高 整体橱柜什么牌子性价比高 哪个牌子的微波炉性价比高 法国性大片在线播放联合传播 性传播疾病专科 接触性传播 通过性传播的疾病 性传播疾病医院