正则表达式基础

来源:互联网 发布:飞天侠淘宝客9.0 编辑:程序博客网 时间:2024/06/18 11:53
Greedy 数量词X?X,一次或一次也没有X*X,零次或多次X+X,一次或多次X{n}X,恰好 n 次X{n,}X,至少 n 次X{n,m}X,至少 n 次,但是不超过 m 次边界匹配器^行的开头$行的结尾\b单词边界\B非单词边界\A输入的开头\G上一个匹配的结尾\Z输入的结尾,仅用于最后的结束符(如果有的话)\z输入的结尾预定义字符类.任何字符(与行结束符可能匹配也可能不匹配)\d数字:[0-9]\D非数字: [^0-9]\s空白字符:[ \t\n\x0B\f\r]\S非空白字符:[^\s]\w单词字符:[a-zA-Z_0-9]\W非单词字符:[^\w]字符类[abc]a、b 或 c(简单类)[^abc]任何字符,除了 a、b 或 c(否定)[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)[a-d[m-p]]a 到 d 或 m 到 p:[a-dm-p](并集)[a-z&&[def]]d、e 或 f(交集)[a-z&&[^bc]]a 到 z,除了 b 和 c:[ad-z](减去)[a-z&&[^m-p]]a 到 z,而非 m 到 p:[a-lq-z](减去)组和捕获 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 1    ((A)(B(C)))2    \A3    (B(C))4    (C)组零始终代表整个表达式。 之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。 package cn.itcast.regex.demo;import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegexDemo2 {/** * @param args */public static void main(String[] args) {/* * 正则表达式对字符串的常见操作: * 1, 匹配。 * 其实使用的就是String类中的matches方法。 *  * 2,切割。 * 其实使用的就是String类中的split方法。  *  * 3,替换。 * 其实使用的就是String类中的replaceAll()方法。 *  * 4,获取。 *  */functionDemo_4();}/* * 获取  * 将正则规则进行对象的封装。  * Pattern p = Pattern.compile("a*b"); *  //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher .  * Matcher m = p.matcher("aaaaab");  * //通过Matcher匹配器对象的方法对字符串进行操作。  * boolean b = m.matches(); *  *  */public  static void functionDemo_4() {String str = "da jia hao,ming tian bu fang jia!";String regex = "\\b[a-z]{3}\\b";//1,将正则封装成对象。Pattern p = Pattern.compile(regex);//2, 通过正则对象获取匹配器对象。 Matcher m = p.matcher(str);//使用Matcher对象的方法对字符串进行操作。//既然要获取三个字母组成的单词 //查找。 find();System.out.println(str);while(m.find()){System.out.println(m.group());//获取匹配的子序列System.out.println(m.start()+":"+m.end());}}/* * 替换  */public static void functionDemo_3() {String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";str = str.replaceAll("(.)\\1+", "$1");System.out.println(str);String tel = "15800001111";//158****1111;tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");System.out.println(tel);}/* * 切割。 *  * 组:((A)(B(C)))  */public static void functionDemo_2(){String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";String[] names = str.split("(.)\\1+");//str.split("\\.");for(String name : names){System.out.println(name);}}/* * 演示匹配。  */public static void functionDemo_1(){//匹配手机号码是否正确。 String tel = "15800001111";String regex = "1[358]\\d{9}";   boolean b = tel.matches(regex);System.out.println(tel+":"+b);}}package cn.itcast.regex.test;import java.util.TreeSet;public class RegexTest {/** * @param args */public static void main(String[] args) {/* * 1,治疗口吃:我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程 * 2,对ip地址排序。  * 3,对邮件地址校验。  */test_3();}//对邮件地址校验。public static void test_3() {String mail = "abc1@sina.com.cn";String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";regex = "\\w+@\\w+(\\.\\w+)+";//1@1.1boolean b = mail.matches(regex);System.out.println(mail+":"+b);}/* * 1,治口吃。 */public static void test_1(){String str = "我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程";//1,将字符串中.去掉。 用替换。str = str.replaceAll("\\.+", "");System.out.println(str);//2,替换叠词。str = str.replaceAll("(.)\\1+", "$1");System.out.println(str);}/* * ip地址排序。  *  * 192.168.10.34 127.0.0.1 3.3.3.3  105.70.11.55 */public static void test_2(){String ip_str = "192.168.10.34  127.0.0.1  3.3.3.3  105.70.11.55";//1,为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。//所以,补零,按照每一位所需做多0进行补充。每一段都加两个0.ip_str = ip_str.replaceAll("(\\d+)", "00$1");System.out.println(ip_str);//然后每一段保留数字3位。ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");System.out.println(ip_str);//1,将ip地址切出。String[] ips = ip_str.split(" +");TreeSet<String> ts = new TreeSet<String>();for(String  ip : ips){//System.out.println(ip);ts.add(ip);}for(String ip : ts){System.out.println(ip.replaceAll("0*(\\d+)", "$1"));}}}

0 0
原创粉丝点击