正则表达式
正则表达式一、概述: 1、概念:符合一定规则的表达式。 2、作用:用于专门操作字符串。 3、特点:用于一些特定的符号来表示一些代码操作,这样就可以简化代码书写。 4、好处:可简化对字符串的基本操作。 5、弊端:符号定义越多,正则越长,阅读性越差。 二、常用符号: 1、字符 构造 匹配 反斜线字符 t 制表符 n 回车符 f 换页符 2、字符类 [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](并集) 3、预定义字符类 . 任何字符(与行结束符可能匹配也可能不匹配) d 数字: [0-9] D 非数字: |^[0-9] s 空白字符:[ tnx0Bfr] S 非空白字符:[^ tnx0Bfr] w 单词字符:[a-zA-Z_0-9] W 非单词字符:[^w] 4、边界匹配器 ^ 行的开头 $ 行的结尾 b 单词边界 B 非单词边界 A 输入的开头 5、Greedy数词量---->匹配整个字符串 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好n次 X{n,} X,至少n次 6、组和捕获 组:在正则中用()来表示,作用是结果可以被重用,如(.)1+,代表的是任意字符出现了多次,就业是叠词 捕获:在正则中可以使用$加上组的编号来完成捕获的,如:"(.)1+","$1"这个$1就代表组代表的元素
三、正则表达式主要有四种具体功能:匹配、切割、替换和获取 1、匹配:用规则匹配整个字符串,只要有一处不符合,就匹配结束,返回false /* * 匹配:String的matches方法,用规则匹配字符串,只有有一处不符合规则就匹配结束,返回false */ public static void match_method() { // 匹配手机号只有13***,15***,18**** String tel = "15900001111"; String teiReg = "1[358]d{9}"; System.out.println(tel.matches(teiReg)); // 匹配多位 String str = "a5656"; String reg = "[a-zA-Z]d*"; System.out.println(str.matches(reg)); // 校验QQ号码,5~15,不能0开头,不能有字母 String qq = "545454545"; String qqReg = "[1-9]d{4,14}"; System.out.println(qq.matches(qqReg)); } 2、切割: split(Stringregex)
// 按照叠词完成切割。为了可以让规则的结果被重用,可以将规则封装成一个组。用()完成。 // 组的出现都有编号。从1开始。 想要使用已有的组可以通过 n(n就是组的编号)的形式来获取。 split_method("ghghhjhhgkaaalkood","(.)1+"); // 按照“.”切,.在正则中是代表任意字符,所以需要转译,然而.在双引号中也需要转译 split_method("zhang.li.wang","."); // 按照“”切 split_method("c:abca.txt","\"); // 按照空格切 split_method("abc a.txt hhhh"," +"); /* * 切割 split */ public static void split_method(String str,String reg) { String[] arr = str.split(reg); System.out.println(arr.length); for (String s : arr) { System.out.println(s); } } 3、替换: replaceAll(Stringregex,Stringreplacement)
String str = "wer1389980000ty1234uiod234345675f";//将字符串中的数组替换成#。
replaceAllDemo(str,"d{5,}","*");
//将叠词替换成#. //将重叠的字符替换成单个字母。zzzz->z
str = "erkktyqqquizzzzzo";
replaceAllDemo(str,"(.)1+","$1");//$获取组
/*
* 替换
*/
public static void replaceAllDemo(String str,String reg,String newStr){
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
获取:将字符串中的符合规则的子串取出。 /* * 正则表达式第四个功能:获取,将字符串中符合规则的字串获取出来 * * 操作步骤: * 1、将正则表达式封装成对象 * 2、让正则对象和要操作的字符串相关联 * 3、关联之后,获取正则匹配引擎 * 4、通过引擎对符合规则的字符串进行操作,比如取出 */ public class RegexDemo2 { public static void main(String[] args) { getDemo(); } public static void getDemo(){ String str = "hahahaha hui jia guo nian la"; String reg = "b[a-z]{3}b";// b单词分隔符//取出str中有三个字母组成的单词 // str = "415454d51"; // reg = "[1-9]{4,14}"; //将正则表达式封装成对象 Pattern p = Pattern.compile(reg); //将要操作的字符串和正则对象相关联,获取匹配器对象 Matcher m = p.matcher(str); //其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。 //只不过被String的方法封装后,用起来较为简单。但是功能却单一。 // System.out.println(m.matches()); // boolean b = m.find();//将规则作用到字符串上,并进行符合规则的查找 // System.out.println(m.group()); // boolean b1 = m.find();//将规则作用到字符串上,并进行符合规则的查找 // System.out.println(m.group()); while(m.find()){ System.out.println(m.group()); System.out.println(m.start() + "......" + m.end()); } } } 练习: /* * 正则练习 * * 思路方式: * 1、如果只想知道该字符串是对是错使用匹配 * 2、要想将已有的字符串变成另一个字符串,替换 * 3、想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。 * 4、想要拿到符合需求的字符串子串,获取。获取符合规则的子串。 */ public class RegexTest { public static void main(String[] args) { test_1(); // ipSort(); // checkMail(); } /* * 需求:将下列字符串转成:我要学编程. 到底用四种功能中的哪一个呢?或者哪几个呢? * * 将已有字符串变成另一个字符串。使用 替换功能。 1,可以先将 . 去掉。 2,在将多个重复的内容变成单个内容。 */ public static void test_1() { String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"; str = str.replaceAll(".+",""); str = str.replaceAll("(.)1+","$1"); System.out.println(str); } /* * 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30 * 将ip地址进行地址段顺序的排序。 * * 还按照字符串自然顺序,只要让它们每一段都是3位即可。 * 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。 * 2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。 */ public static void ipSort(){ String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"; ip = ip.replaceAll("(d+)","00$1");//给每一段都不上0,按照最少位数的需要进行补 ip = ip.replaceAll("0*(d{3})","$1");//只保留三位数字的字段 System.out.println(ip); String[] arrs = ip.split(" +"); TreeSet<String> ts = new TreeSet<String>(); for(String s : arrs){ ts.add(s); } for(String s : ts){ System.out.println(s.replaceAll("0*(d+)","$1")); } } /* * 需求:对邮件地址进行校验。 */ public static void checkMail(){ String mail = "abc12@sina.com"; String reg = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(.[a-zA-Z]+)+";//较为精确 // reg = "w+@w+(.w)+";//相对不太精确的匹配。 System.out.println(mail.matches(reg)); } } 2、网页爬虫(蜘蛛): 实际上是一个功能,用于搜集网络上的指定信息,例如百度就在应用这项技术获取各种关键字,可供搜索,简单的说你要在百度上搜索一个“春节”的关键字,它就会找到跟关键字相关联的文章列出来。其实百度事先就在各个网页上获取了相关资源,这个获取资源就是通过网页爬虫技术来完成的。 需求:可用于收集邮箱等之类的信息。
/* * 网页爬虫(蜘蛛)获取网页数据工具 */ public class RegexTest2 { public static void main(String[] args) throws IOException { // getMail(); getMailByNet(); } /* * 获取网页数据,获取网页上有关邮箱的数据 */ public static void getMailByNet() throws IOException { URL url = new URL("http://192.168.229.1:8080/myweb/mail.html"); URLConnection conn = url.openConnection(); BufferedReader bfrin = new BufferedReader(new InputStreamReader( conn.getInputStream())); String mailReg = "w+@w+(.[a-zA-Z])+"; Pattern p = Pattern.compile(mailReg); String line = null; while ((line = bfrin.readLine()) != null) { Matcher m = p.matcher(line); while (m.find()) { System.out.println(m.group()); } } bfrin.close(); } /* * 获取指定文档中的邮件地址。 使用获取功能。Pattern Matcher */ public static void getMail() throws IOException { BufferedReader bfr = new BufferedReader(new FileReader("mail.txt")); String mailReg = "w+@w+(.[a-zA-Z])+"; Pattern p = Pattern.compile(mailReg); String line = null; while ((line = bfr.readLine()) != null) { Matcher m = p.matcher(line); while (m.find()) { System.out.println(m.group()); } } bfr.close(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |