Java 正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 正则表达式相关的知识,希望对你有一定的参考价值。
package com.fish.regex; /* 正则表达式:正则表达式就是用于操作字符串的一个规则,正则表达式的规则使用特殊的符合表示 需求:检验一个QQ号 1、不能以0开头 2、长度5-11 3、只能由数字组成 校验邮箱、校验***号码,校验手机号 */ public class Demo1 { public static void main(String[] args) { String qq = "1234557"; /*if(!qq.startsWith("0")){ if(qq.length()>=5 && qq.length()<=11){ try { Long.parseLong(qq); System.out.println("恭喜你,你得到了一个合法QQ"); } catch (Exception e) { // TODO: handle exception System.out.println("非法QQ,QQ号只能由数字组成"); } }else { System.out.println("非法QQ,QQ号的长度只能是5~11位"); } }else{ //以0开头 System.out.println("非法QQ,QQ号不能以0开头"); }*/ System.out.println(qq.matches("[1-9]\\d{4,10}")?"合法QQ":"非法QQ"); } }
package com.fish.regex; public class Demo2 { public static void main(String[] args) { /* 预定义字符类 . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \r回车 \n 换行 \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] 注意:任何预定义字符没有加上数量词之前都只能匹配一个字符而已 */ System.out.println("任意字符:"+"%".matches(".")); System.out.println("数字字符:"+"12".matches("\\d")); System.out.println("非数字字符:"+"@".matches("\\D")); System.out.println("空白字符:"+"\r".matches("\\s")); System.out.println("非空白字符:"+"\n".matches("\\S")); System.out.println("单词字符:"+"".matches("\\w")); System.out.println("非单词字符:"+"@".matches("\\W")); /* Greedy 数量词 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次 */ System.out.println("?一次或一次也没有:"+"1".matches("\\d?")); System.out.println("* 零次或多次:"+"1".matches("\\d*")); System.out.println("+ 至少出现一次:"+"1".matches("\\d+")); System.out.println("{次数} 恰好出现n次:"+"12345678901".matches("\\d{11}")); System.out.println("{次数,} 至少要出现指定的次数:"+"12345678901".matches("\\d{3,}")); System.out.println("{次数1,次数2} 指定出现次数的范围:"+"12345".matches("\\d{3,4}")); /* 范围词 [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 注意:范围词里面不管内容有多长,没有数量词的匹配都只能匹配一个字符而已 */ System.out.println("abc".matches("[abc]")); System.out.println("@".matches("[^abc]")); System.out.println("字符可有出现在a-z之间"+"a".matches("[a-zA-Z#]")); } }
package com.fish.regex; import java.util.Arrays; /* 正则表达式主要是用于操作字符串的规则,正则表达式对字符串的操作主要有以下几种应用 匹配: matches() 切割:split() 替换 :replaceAll(String regex, String replacement) 查找: */ public class Demo3 { public static void main(String[] args) { matchesPhone("1355642459"); matchesTel("020-88524574"); testPlit1(); testPlit2(); replaceTest1() ; replaceTest2(); } // 需求:编写一个正则表达式匹配手机号 ,第一位:只能是1开头,第二位:35478 长度:11位 public static void matchesPhone(String phone) { String reg = "1[34578]\\d{9}"; System.out.println(phone.matches(reg) ? "合法手机号" : "非法手机号"); } // 需求,匹配固定电话 ,区号-主机号 区号:首位是0 长度3~4 主机号: 首位不能是0 长度7~8位 public static void matchesTel(String tel) { System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}") ? "合法固话": "非法固话"); } // 根据空格切割 public static void testPlit1() { String str = "明 天 放 假"; String[] datas = str.split(" +"); System.out.println("数组的元素" + Arrays.toString(datas)); } // 根据重叠词进行切割 /* * 组和捕获 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: * * 1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C) * * 组零始终代表整个表达式。 注意:从最左边的括号开始计算组 */ public static void testPlit2() { String str = "大家家家明天天玩得得得得得得得开心";// 大明玩开心 String[] datas = str.split("(.)\\1+"); // 如果正则内容需要被复用,需要对正则的内容进行分组,分组的目的是为了提高正则的复用性.组号不能指定,组号从1开始 System.out.println("数组的元素" + Arrays.toString(datas)); } // 作业:编写一个正则匹配一个邮箱 // 替换 public static void replaceTest1() { String str = "联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119"; String reg = "1[34578]\\d{9}"; str = str.replaceAll(reg, "******"); System.out.println("替换后的帖子:" + str); } public static void replaceTest2() { String str = "我我我要要要做做做做项项项项项项目目"; String reg = "(.)\\1+"; str = str.replaceAll("(.)\\1+", "$1");//如果需要在replaceAll方法正则外部引用组的内容,那么使用"$组号" System.out.println("替换后的帖子:" + str); } }
package com.fish.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 查找: 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的正則對象匹配任意的字符串用于创建 Matcher 对象, 依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。 因此,典型的调用顺序是 Pattern p = Pattern.compile("正則"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); 一次匹配: boolean b = Pattern.matches("a*b", "aaaaab"); 查找需要使用的對象 1、Pattern(正则对象) 2、Matcher(匹配对象) 匹配要使用到的方法: 1、find() 通知匹配器去匹配字符串,查找符合规则的字符串,如果能查找到符合规则的字符串,则返回true,否则返回false 2、group() 获取符合规则的子串 注意:使用group方法的时候,一定要先调用find方法让匹配器去查找符合规则的字符串,否则报错 */ public class Demo4 { public static void main(String[] args) { //想要获取由3个字母组成的单词。 String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!"; String reg = "\\b[a-zA-Z]{3}\\b";//先要把字符串的正则编译成Pattern对象 Pattern p = Pattern.compile(reg);//使用正则对象匹配字符串用于 产生一个Matcher对象 Matcher m = p.matcher(str); System.out.println("有符合规则的字符串吗?"+m.find()); //一次获取一次 System.out.println("获取结果"+m.group()); //一次获取一次 System.out.println("获取结果"+m.group()); //一次获取一次 while(m.find()) { //System.out.println(m.start()+"...."+m.end()); //System.out.println("sub:"+str.substring(m.start(),m.end())); System.out.println(m.group()); } //System.out.println(m.find());//将规则对字符串进行匹配查找。 //System.out.println(m.find());//将规则对字符串进行匹配查找。 //System.out.println(m.group());//在使用group方法之前,必须要先找,找到了才可以取。 } }
package com.fish.regex; /* 边界匹配器 ^ 行的开头 $ 行的结尾 \b 单词边界 单词编辑匹配器只是代表了单词的开始或者是结束部分,不匹配任何的字符 \B 非单词边界 \A 输入的开头 \G 上一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符(如果有的话) \z 输入的结尾 */ public class Demo5 { public static void main(String[] args) { System.out.println("hello world".matches("hello\\b world")); } }
package com.fish.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 网络爬虫(网络蜘蛛): */ public class Demo6 { // .com .cn .com.cn .net public static void main(String[] args) { String content = "有事没事联系:[email protected] 有事没有联系:[email protected]"; String reg = "[a-zA-Z1-9]\\w*@[a-zA-Z0-9]{2,}(\\.(com|cn|net)){1,2}"; // 把字符串的正则编译成正则对象 Pattern p = Pattern.compile(reg); // 使用正则对象产生匹配器对象 Matcher m = p.matcher(content); while (m.find()) { System.out.println(m.group()); } } }
本文出自 “小鱼的博客” 博客,谢绝转载!
以上是关于Java 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章