加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 19:36:43 所属栏目:百科 来源:网络整理
导读:正则表达式 一、概述 1、概念:符合一定规则的表达式。 2、作用:用于专门操作字符串。 3、特点:用于一些特定的符号来表示一些代码操作,这样就可以简化代码书写。 4、好处:可简化对字符串的基本操作。 5、弊端:符号定义越多,正则越长,阅读性越差。 二

正则表达式

一、概述

1、概念:符合一定规则的表达式。

2、作用:用于专门操作字符串。

3、特点:用于一些特定的符号来表示一些代码操作,这样就可以简化代码书写。

4、好处:可简化对字符串的基本操作。

5、弊端:符号定义越多,正则越长,阅读性越差。


二、常用符号:

说明:X表示字符X或者匹配的规则。

一)字符

构造 匹配

反斜线字符

t 制表符

n 回车符

f 换页符

二)字符类

[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](并集)

三)预定义字符类

. 任何字符(与行结束符可能匹配也可能不匹配)

d 数字: [0-9]

D 非数字: |^[0-9]

s 空白字符:[ tnx0Bfr]

S 非空白字符:[^ tnx0Bfr]

w 单词字符:[a-zA-Z_0-9]

W 非单词字符:[^w]

四)边界匹配器

^ 行的开头

$ 行的结尾

b 单词边界

B 非单词边界

A 输入的开头

五)Greedy数词量---->匹配整个字符串

X? X,一次或一次也没有

X* X,零次或多次

X+ X,一次或多次

X{n} X,恰好n次

X{n,} X,至少n次

X{n,m} X,至少n次,但不超过m次

六)组和捕获

捕获组可通过从左到右计算其开括号来编号。例如,在表达式((A)(B(C)))中,存在四个这样的组:

1 ((A)(B(C)))
2 A
3 (B(C))
4 (C)
组零始终代表整个表达式

在替换中常用$匹配组的内容,下面将会介绍到

三、正则表达式具体功能

主要有四种具体功能:匹配、切割、替换和获取

1、匹配:String matches方法。

用规则匹配整个字符串,只要有一处不符合,就匹配结束,返回false


  1. //匹配
  2. /*
  3. *1、对qq号进行校验
  4. *要求:5~150不能开头,只能是数字
  5. */
  6. //非正则写法
  7. publicstaticvoidcheckQQ1(StringqqStr){
  8. intlen=qqStr.length();
  9. if(len>=5&&len<=15){
  10. if(qqStr.indexOf(0)!='0'){
  11. Longl=Long.parseLong(qqStr);
  12. System.out.println("qq为:"+l);
  13. }
  14. else
  15. System.out.println("不可以0开头");
  16. }
  17. else
  18. System.out.println(qqStr+"不合法");
  19. }
  20. //正则写法
  21. publicstaticvoidcheckQQ(StringqqStr){
  22. //定义规则
  23. Stringreg="[1-9]d{4,14}";
  24. if(qqStr.matches(reg))
  25. System.out.println("qq:"+qqStr);
  26. else
  27. System.out.println(qqStr+"不是qq号");
  28. }
  29. //匹配电话号码
  30. /*
  31. *1、手机号段只有13xxx15xxx18xxxx
  32. *2、座机号:010-65784236,0316-3312617,022-12465647,03123312336
  33. */
  34. publicstaticvoidcheckTel(StringtelStr,Stringregex){
  35. if(telStr.matches(regex))
  36. System.out.println(telStr);
  37. else
  38. System.out.println("此号码非电话号");
  39. }
测试:
  1. publicstaticvoidmain(String[]args){
  2. //------匹配-----
  3. //校验qq号
  4. checkQQ1("1670123");
  5. checkQQ("167014f23");
  6. checkQQ("01654212465");
  7. //座机号
  8. Stringreg1="0d{2}-?d{8}|0d{3}-?d{7}";
  9. System.out.println("座机号为:");
  10. checkTel("010-43367456",reg1);
  11. //手机号
  12. Stringreg2="1[358]d{9}";
  13. System.out.println("手机号为:");
  14. checkTel("13103030605",reg2);
  15. }

2、切割:String split()
  1. //切割
  2. //切割带空格或点的字符串
  3. publicstaticvoidsplitDemo(Stringstr,Stringreg){
  4. String[]arr=str.split(reg);
  5. System.out.println("长度为:"+arr.length);
  6. for(Strings:arr){
  7. System.out.println(s);
  8. }
  9. }
测试
  1. publicstaticvoidmain(String[]args){
  2. //----------切割----------
  3. Stringstr1="zhangsanlisiwangwuzhaoliu";
  4. Stringstr2="zhangsan.lisi.wangwu.zhaoliu";
  5. System.out.println("str1的结果:");
  6. splitDemo(str1,"+|.");
  7. System.out.println("str2的结果:");
  8. splitDemo(str2,"+|.");
  9. Stringstrsp="erkktyqqquizzzzzo";
  10. System.out.println("按叠词切:");
  11. splitDemo(strsp,"(.)1+");
  12. }
说明:

按叠词完成切割:为了让规则被重用,可将规则封装成一个组,用()完成,组有编号,从1开始要用已有的组,可通过n来获取,这里的n表示的是组的编号,如第一组即为1
3、替换:

String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

  1. //替换
  2. publicstaticvoidreplaceDemo(Stringstr,
  3. Stringregex,StringnewStr){
  4. str=str.replaceAll(regex,newStr);
  5. System.out.println(str);
  6. }
测试:
  1. publicstaticvoidmain(String[]args){
  2. //----------替换----------
  3. System.out.println("--替换---");
  4. //替换数字
  5. StringstrNum="wer1389980000ty1234564uiod234345675f";
  6. replaceDemo(strNum,"d+","*");
  7. //替换叠词
  8. Stringstrs="erkktyqqquizzzzzo";
  9. replaceDemo(strs,"(.)1+","$1");
  10. }

4、获取:

获取:将字符串中的符合规则的子串取出。


操作步骤:
1)将正则表达式封装成对象。
2)让正则对象和要操作的字符串相关联。
30关联后,获取正则匹配引擎。
4)通过引擎对符合规则的子串进行操作,比如取出。


  1. importjava.util.regex.Matcher;
  2. importjava.util.regex.Pattern;
  3. publicclassRegexGetMathod{
  4. publicstaticvoidmain(String[]args){
  5. Stringstr="mingtianjiuyaofangjiale,dajia。";
  6. getSub(str,"b[a-z]{3}b");
  7. }
  8. //获取子串
  9. publicstaticvoidgetSub(Stringstr,Stringregex){
  10. //将规则封装成对象
  11. Patternp=Pattern.compile(regex);
  12. //让正则对象和要作用的字符集相关联,获取匹配器对象
  13. Matcherm=p.matcher(str);
  14. //booleanb=m.find();//将规则作用到字符串上,并进行符合规则的子串查找
  15. //m.group();//用于获取匹配后结果
  16. while(m.find()){
  17. System.out.print(m.group());
  18. System.out.println("-->位置为:"+m.start()+"---"+m.end());
  19. }
  20. }
  21. }


说明:
其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。只不过被String的方法封装后,用起来较为简单。但是功能却单一。


四、示例

四种功能的选择:

思路方式:
1、如果只想知道该字符是否对是错,使用匹配。
2、想要将已有的字符串变成另一个字符串,替换。
3、想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
4、想要拿到符合需求的字符串子串,获取。获取符合规则的子串。

1、替换字符串

  1. publicstaticvoidreplaceStr()
  2. {
  3. Stringstr="我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
  4. /*
  5. 将已有字符串变成另一个字符串。使用替换功能。
  6. 1,可以先将.去掉。
  7. 2,在将多个重复的内容变成单个内容。
  8. */
  9. str=str.replaceAll(".+","");
  10. System.out.println(str);
  11. str=str.replaceAll("(.)1+","$1");
  12. System.out.println(str);
  13. }

2、ip地址的排序

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位。

  1. publicstaticvoidipSort()
  2. {
  3. Stringip="192.68.1.254102.49.23.01310.10.10.102.2.2.28.109.90.30";
  4. ip=ip.replaceAll("(d+)","00$1");
  5. System.out.println(ip);
  6. ip=ip.replaceAll("0*(d{3})","$1");
  7. System.out.println(ip);
  8. String[]strs=ip.split("");
  9. Arrays.sort(strs);
  10. for(Stringstr:strs){
  11. str=str.replaceAll("0*(d+)","$1");
  12. System.out.println(str);
  13. }
  14. }


3、对邮箱地址进行校验
  1. publicstaticvoidcheckMail()
  2. {
  3. Stringmail="abc12@sina.com";
  4. //mail="1@1.1";
  5. Stringreg="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(.[a-zA-Z]+){1,2}";//较为精确的匹配。
  6. //reg="w+@w+(.w+){1,2}";//相对不太精确的匹配。
  7. //mail.indexOf("@")!=-1
  8. System.out.println(mail.matches(reg));
  9. }

4、网页爬虫(蜘蛛):

实际上是一个功能,用于搜集网络上的指定信息

需求:可用于收集邮箱,qq号等之类的信息。

应用:如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog

示例:

  1. importjava.io.BufferedReader;
  2. importjava.io.IOException;
  3. importjava.io.InputStreamReader;
  4. importjava.net.MalformedURLException;
  5. importjava.net.URL;
  6. importjava.net.URLConnection;
  7. importjava.util.regex.Matcher;
  8. importjava.util.regex.Pattern;
  9. publicclassRegexTest1{
  10. /**
  11. *@网络爬虫
  12. *
  13. */
  14. publicstaticvoidmain(String[]args){
  15. crawler("file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/%E9%82%AE%E4%BB%B6.htm");
  16. }
  17. //网页爬虫功能,获取指定网址的邮箱
  18. publicstaticvoidcrawler(StringurlPath){
  19. URLul=null;
  20. BufferedReaderbr=null;
  21. //建立连接
  22. try{
  23. ul=newURL(urlPath);
  24. }catch(MalformedURLExceptione){
  25. thrownewRuntimeException("指定地址未找到");
  26. }
  27. URLConnectionconn;
  28. try{
  29. conn=ul.openConnection();
  30. br=newBufferedReader(newInputStreamReader(conn.getInputStream()));
  31. }catch(IOExceptione1){
  32. thrownewRuntimeException("连接失败");
  33. }
  34. //匹配指定的内容
  35. Patternp=Pattern.compile("w+@w+(.w){1,2}");
  36. Stringline=null;
  37. try{
  38. while((line=br.readLine())!=null){
  39. Matcherm=p.matcher(line);
  40. while(m.find())
  41. System.out.println(m.group());
  42. }
  43. }catch(IOExceptione){
  44. thrownewRuntimeException("读取数据失败");
  45. }
  46. }
  47. }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读