正则表达式

xiaoxiao2021-02-28  28

正则表达式可以用来操作字符串数据,是通过一些特定的符号来体现的。

正则表达式的常见规则: [abc] a、b或c(简单类) [^abc] 任何字符,除了abc [a-zA-Z] a到z或者A到Z [a-d[m-p]] a到d或者m到p [a-z&&[def]] a到z与def之间的交集。 . 任何字符 \d 数字[0-9] \D 非数字[^0-9] \s 空白字符 \S 非空白字符 \w 单词字符[a-zA-Z_0-9]表示大小写字母或下划线或数字 \W 非单词字符  ^ 行的开头 $ 行的结尾 \b 单词边界   X? X,一次或者一次也没有(要么没有,要么有一次) X* X,零次或者多次(要么没有,要么有多次) X+ X,一次或多次 X{n} 恰好n次。 X{n,} 至少n次

 X{n,m} 至少n次,之多m次

正则表达式对字符串的几种常见的操作:

/* * 演示获取 * 将正则规则进行对象的封装。 * Pattern p = Pattern.compile("a*b"); * //通过正则对象的macher方法字符串相关联,获取要对字符串操作的匹配器对象Macher. * Macher m = p.macher("aaaaab"); * //通过Matcher匹配器对象的方法对字符串进行操作。 * boolean b = m.maches(); * * */ 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对象的方法对字符串进行操作。 //既然要获取三个字母组成的单词,就需要查找。 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 = "xiaoqiangttttzhangsanbbbbblisi"; // str = str.replaceAll("(.)\\1+", "#");//将所有的叠词都换成# str = str.replaceAll("(.)\\1+", "$1");//将叠词替换成单个的原来的字母,即将tttttt替换成t //$符号表示获取上一个正则表达式的符号。1表示上一个正则表达式的第一个元素。 System.out.println(str); String tel = "15800001111";//实现将号码显示称为158****1111 tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); // tel = tel.replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1****$3");//组号按照左括号数,与上述语句实现相同的功能。 System.out.println(tel); } /* * 演示切割 * 组:(A(B(C))) 4组 1(A(B(C))) 2\A 3(B(C)) 4(C) * 捕获组可以通过从左到右计算开括号来编号 * 组零始终代表整个表达式。 * * */ public static void functionDemo_2() { // String str = "xiaoqiang zhangsan lisi"; // String[] names = str.split(" +"); // String str = "xiaoqiang.zhangsan.lisi"; // String[] names = str.split("\\.+");//.是正则表达式中的特殊符号,需要进行转义\\. String str = "xiaoqiangttttzhangsanbbbbblisi"; String[] names = str.split("(.)\\1+");//组,将.封装成组,即任意符号,组号为1,这组任意符号可以重复一次或者多次。(.)\\1+则表示叠词 for(String name : names){ System.out.println(name); } } /* * 演示匹配 */ public static void functionDemo_1() { //匹配手机号码是否正确。 String tel = "15800001111"; // String regex = "1[358][0-9]{9}";//范围用[]表征,次数用{}表征 String regex = "1[358]\\d{9}";//"\\d" boolean b = tel.matches(regex); System.out.println(tel+":"+b); }

正则表达式的几个案例:

/* * 1,治口吃 */ public static void test_1(){ String str = "我我...我我我..我要要....要要要..要要学学学....学学....学学编编....编编编..编编编程程程...程程..程"; //1,将字符串中的.去掉,用替换方法 str = str.replaceAll("\\.+", ""); //2,替换叠词 str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str); } /* * 2、ip地址排序 * 192.168.10.33 127.0.0.1 105.70.11.55 3.3.3.3 */ public static void test_2(){ String ip_str = "192.168.10.33 127.0.0.1 105.70.11.55 3.3.3.3"; //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); String[] ips = ip_str.split(" +"); TreeSet<String> ts = new TreeSet<String>(); for(String str :ips){ ts.add(str); } for(String ip :ts){ System.out.println(ip.replaceAll("0*(\\d+)", "$1")); } //1 将ip地址切出 /*String[] ips = ip_str.split(" +"); TreeSet<String> ts = new TreeSet<String>(); for(String str :ips){ ts.add(str); } for(String ip :ts){ System.out.println(ip);//按照字符串排序排序结果错误,因为ip地址的每一位的位数不同 }*/ } /* * 3,校验邮件地址 * * */ public static void test_3() { String mail = "abc@sina.com"; String regex = "[a-zA-z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{2,3})+"; regex = "\\w+@\\w+(\\.\\w+)+";//笼统式匹配 boolean b = mail.matches(regex); System.out.println(mail+":"+b); }

简单的网页爬虫案例(从网页html文件中爬邮箱地址):

/* * 从所给网址中找出邮箱,并存储在list中。 */ public static List<String> getMailsByWeb() throws IOException { URL url = new URL("http://hao.360.cn/mkt.html"); BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream())); //对读取到的数据进行规则匹配,从中获取符合规则的数据。 String mail_regex = "\\w+@\\w+(\\.\\w+)+"; List<String> list = new ArrayList<>(); Pattern p = Pattern.compile(mail_regex); String line = null; while((line=bufr.readLine())!= null){ Matcher m = p.matcher(line); if(m.find()){ //3,将符合规则的数据存储到集合中。 list.add(m.group()); } } return list; } /* * 从所给html文件中搜寻邮箱,并返回到list中。 */ public static List<String> getMails() throws IOException{ //1,读取源文件 BufferedReader bufr = new BufferedReader(new FileReader("mail.html")); //对读取到的数据进行规则匹配,从中获取符合规则的数据。 String mail_regex = "\\w+@\\w+(\\.\\w+)+"; List<String> list = new ArrayList<>(); Pattern p = Pattern.compile(mail_regex); String line = null; while((line=bufr.readLine())!= null){ Matcher m = p.matcher(line); if(m.find()){ //3,将符合规则的数据存储到集合中。 list.add(m.group()); } } return list; }
转载请注明原文地址: https://www.6miu.com/read-2650118.html

最新回复(0)