符合一定规则的表达式。(操作字符串的规则)
作用:用于专门操作字符串。 特点:用一些特定的符号来表示一些代码操作,这样就简化了书写。所以学习正则表达式,就是在学习一些特殊符号的使用。 好处:可以简化对字符串的复杂操作。 弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能: 1、匹配:String类中的 matches()方法。用规则匹配整个字符串,只要有一处不符合规则就匹配结束,返回false 2、切割:String类中的 split()方法。 3、替换:String类中的 replaceAll()、replaceFirst()方法. 4、获取:Pattern类中的compile、matcher、find、group等一系列方法
String类中的matches()方法 boolean - matches(String regex);告知此字符串是否匹配给定的正则表达式。
class RegexDemo { public static void checkTel() //练习:匹配手机号,手机号段只有13xxx 15xxx 18xxx { BufferedReader bufr = null; try { bufr = new BufferedReader(new InputStreamReader(System.in)); String tel = bufr.readLine(); //String tel = "12911289129"; String regex = "[1][358]\\d{9}"; boolean b = tel.matches(regex); if(b) sop("tel:"+tel); else sop("手机号不匹配"); } catch (IOException e) { } finally { if(bufr != null) try { bufr.close(); } catch (IOException e) { } } } public static void demo() { String str = "c1"; String reg = "[a-zA-Z]\\d";//第一位字母,第二位数字 boolean b = str.matches(reg); sop(b); } public static void checkQQ() { String qq = "1356944544"; String regex = "[1-9] [0-9]{4-14}";//正则表达式 boolean flag = qq.matches(regex); if(flag) sop(qq+"---is OK!"); else sop(qq+"---nonononono"); } public static void sop(Object obj) { System.out.println(obj); } }1、String - split(String regex); 根据给定正则表达式的匹配拆分此字符串; 2、String - split(String regex,int limit); 根据匹配给定的正则表达式来拆分此字符串。
+ 表示出现一次或多次
不能用”.”来切割,因为被正则表达式(表示任意字符)占用,如果要用写作"\\."
为了可以让规则的结果被重用,可以将规则分装成一个组,用小括号()完成。 组的出现都有编号,从1 开始。想要使用已有的组,可以使用\\n 的形式获取, n 就是组的编号。
(1(2(3))(4)) 有几个组看有几个左括号,第几个左括号就是第几组
正则表达式的弊端:符号定义越多,正则越长,阅读性越差。
class RegexDemo2 { public static void main(String[] args) { splitDemo("zhangsan ,./\\ -lisi ,.,/,.,. wangwu","[^a-zA-Z-]+"); //splitDemo("zhangsan.lisi.wangwu","\\.");//用.切 //splitDemo("C:\\abc\\a.txt","[^a-zA-Z.:]+");//用非字母、“.”以及‘:’切 //splitDemo("C:\\abc\\a.txt","\\\\");//用\\切 //splitDemo("erkkteeeeeyqqui","(.)\\1+");//用叠词切 } public static void splitDemo(String str,String reg) { String[] arr = str.split(reg); sop(arr.length); for (String s : arr) { sop(s); } } public static void sop(Object obj) { System.out.println(obj); } }替换:String - replaceAll(String regex,String replacement); 使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
String - replaceFirst(String regex,String replacement); 使用给定的replacement替换此字符串所有匹配给定的正则表达式的第一个子字符串。
class RegexDemo3 { public static void main(String[] args) { String str = "wer234tyu452342346ioui678op"; //1、要求:将字符串中的连续超过5个的数字替换成# replaceAllDemo(str,"[0-9]{5,}","#"); replaceAllDemo(str,"\\d{5,}","#"); String str1 = "ereeeeetyfffffui"; //2、要求:将叠词替换成$ $在正则化中是特殊符号 replaceAllDemo(str1,"(.)\\1+","\\$");//不写\\会越界,$后面没有数字默认整个字符串 //3、要求,将叠词替换成单个词 -- 用$n符号可以指定组中的第n组 replaceAllDemo(str1,"(.)\\1+","$1");//newStr 为前面组中的第一个组 } public static void replaceAllDemo(String str,String reg,String newStr) { String str2 = str.replaceAll(reg,newStr); sop(str2); } public static void sop(Object obj) { System.out.println(obj); } }获取:将字符串中符合规则的子串取出。
操作步骤: 1、将正则表达式封装成对象; 2、让正则对象和要操作的字符串相关联; 3、关联后,获取正则匹配引擎; 4、通过引擎对符合规则的子串进行操作,比如取出。
static Pattern - compile(String regex); 将给定的正则表达式编译到模式中。 static Pattern - compile(String regex,int flags); 将给定的正则表达式编译到具有给定标识的模式中。 int - flags(); 返回此模式的匹配标志。 Matcher - matcher(CharSequence input); 创建匹配给定输入与此模式的匹配器。
其实String类中的matches方法其实就是用的Pattern和Matcher 方法完成的。只不过被String的方法封装后,用起来比较简单, 但是功能却单一了。