• 正则表达式基础总结


    今天学正则表达式,发现正则表达式知识点很碎,于是做了一下总结,在此分享一下。

    正则表达式:

    用来匹配某些字符,比如数字字母,汉字,下划线,及如 等特殊字符,比较好用的软件有RegexBuddy软件,推荐初学者可以用这个软件熟悉一下正则的语法

    一些匹配的原则

    1      \    {     }    *等用来匹配特殊字符比如 可以匹配所有的制表符

    2:对于常见的数字字母,汉字,下划线等普通字符在匹配一个字符串时,匹配与之对应的一个字符

    1. 一些可以匹配多个字符的表达式

       代表换行符

       代表制表符

      \代表本身

    ^ ,$,&等等代表匹配这些字符本身

    d代表匹配0-9数字的任意一个(比如十位数会看成两个个位数匹配两)

    w任意一个字母数字或者下划线,也就是A~Za~z0~9,_中任意一个

    W。相对于w取反

    s包括空格,制表符,换行符等空白字符的任意一个

    s。相对与S取反

    .小数点可以匹配任意一个字符如果要匹配任意包括“N”在内的所有字符,一般用【sS(.不可以匹配换行符但sS可以匹配任何字符)

    4:自定义匹配原则

    [abc&]表示可以匹配abc&

    [^abc]表示可以匹配除了abc之外所有的字符

    [f-k]表示可以匹配f-k之间的所有字符

    [^a-f0-3]表示可以匹配af0-3之外的所有字符

    -------正则表达式的特殊字符,被包含到中括号中,则失去特殊含义,除了^,-之外

    ------标准字符集合,除小数点之外如果被包含在中括号,自定义字符集合将包含再此集合,比如

    [d.-+]将匹配数字,小数点,+-(其实就是一种或的关系)(对于小数点将失去匹配所有字符的含义,只是小数点而已)

    5量词

    含义:修饰匹配次数的特殊符号

    {n}:表示重复n次,比如d{9}表示匹配连续的9个数字

    {n,m}:表示至少重复n次,之多重复m次比如ad{0,1}b表示ab之间有一个或者零个数字

    {m,}:表示至少重负m

    :匹配表达式0次或者1次,相当于{0,1}

    +:表达式至少出现1次,相当于{1}

    *:表达式不出现或出现任意次,相当于{0}

    匹配次数的贪婪模式(匹配字符越多越好,默认!)比如对于{3,6}最多匹配6次最少3次则根据贪婪模式会把前六个匹配23678951

    对于非贪婪模式就是比贪婪模式多个?如{3,6}?则出现如下的匹配23678951

    6字符边界

    ---(本组标记匹配的不是字符还是位置,符合某种条件的位置)

    ^:与字符串开始的地方匹配(注意不在中括号里面)^i表示第一行第一个字符为i

    $:与字符串结束的地方匹配$i(表示行的最后一个字符为i)

    匹配一个单词边界

    -匹配这样一个位置:前面的字符和后面的字符不全是w比如匹配字符liulei则对于12liulei12不可以匹配(两边全部是w)而liulei33可以匹配

    IGNORECASE 忽略大小写模式

      正常情况下,正则表达式是要区分大小写的

    SINGLELINE单行模式

    整个文本看做一个字符串,只有一个开头,一个结尾。

    使小数点.”可以匹配包含换行符在内的任意字符

    MULTITLE 多行模式

    每行都是一个字符串,都有开头和结尾

    在指定了一个字符串后,都有开头和结尾

    在指定了MULTITLE之后,如果需要仅匹配字符串开始和结束的位置,可以使用A

     

    7选择符和分组

    |(分支结构)左右两边表达式之间“或”关系,匹配左边或者右边

    比如: a|b则可以匹配字母a或者b。。。。。。。。。

    ()(捕获组)(1)在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰(2)取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到(3)每一次括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号,捕获元素为零的第一个捕获是由整个正则表达式模式匹配的文本

    ?:Expression)一些表达式中,不得不使用(),但又不需要保存()中表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用,(匹配到的内容并不保存,好处是不占内存)

    反向引用( n):

    -每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。

    -通过反向引用,可以对分组已经捕获的字符串进行引用

    比如([a-z]{2}1表示连续的两个az之间的字母然后捕获的内容再重复一次比如gogogo捕获再反向引用捕获的内容一次即最后捕获gogo

    8预搜索(零宽断言)

    ?=exp)断言自身出现的位置的后面能匹配表达式exp

    [a-z]+(?=ing)可以匹配所有以ing结尾的单词

    ?<=exp)断言自身出现的位置的前面能匹配表达式exp

    [a-z]+(?<=ing)可以匹配所有以ing开头的单词

    ?exp)断言自身出现的位置的后面不能匹配表达式exp

    [a-z]+(?ing)不可以匹配所有以ing结尾的单词

    ?<!exp)断言自身出现的位置的前面不能匹配表达式exp

    [a-z]+(?<!ing)不可以匹配所有以ing开头的单词

    正则表达式的应用

    1固定电话的匹配(由七到八位数字和下划线组成)

    0371-23233325

    010-2365323

    则表达式如下

    0d{2,3}-d{7,8}

    2手机号的匹配

    1[35789]d{9}

    3邮箱的应用

    1958966655@qq.com

    Wcwecew163.com

    则表达式如下

    [w-]+@[a-z0-9A-Z]+(.[A-Za-z](2,4)(1,2))

    下面是在eclipse里面实现正则表达式的一个demo,可以参考一下

    package test;

    import java.util.Arrays;
    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class Demo1 {
    public static void main(String[] args) {
    //在这个字符串中把数字找出来asfsdf23323
    Pattern p=Pattern.compile("\d+");//p代表正则表达式,只不过要注意斜杠是两个
    Matcher m=p.matcher("asfsdf%%&&**23323");//指定匹配的字符串
    boolean yesorno=m.matches();//将整个字符序列与该模式匹配,因为有%&*所以返回false指针会移到出错的位置,下次从出错的位置继续向下找
    //boolean yesorno2=m.find();//该方法扫描输入的字符序列,查找与该模式匹配的下一个子序列;
    //System.out.println(yesorno2);
    while(m.find()){
    System.out.println(m.group());//把找到的内容返回
    }
    System.out.println(yesorno);
    String str=m.replaceAll("#");//数字替换
    System.out.println(str);
    String str1="a2265c326d";
    String []ar=str1.split("\d+");//以数字作为分界点进行切割;
    System.out.println(Arrays.toString(ar));
    Scanner s=new Scanner(System.in);
    //int []array=new int[5];
    String year;
    while(true){
    year=s.next();//验证用户输入的是数字。
    //Pattern p1=Pattern.compile("^\d+");
    Matcher mm=p.matcher(year);
    boolean s1=mm.matches();
    if(false){
    System.out.println("请输数字");
    }
    else
    break;

    }

    }
    }

    总结:学习正则表达式的时候把常用的几个记住理解就行,当我们需要用的时候再翻阅笔记,并希望大家可以多用一下RegexBudd这个软件练习正则,

    而且正则表达式是学习爬虫的基础。

  • 相关阅读:
    Moodle 3.8 安装过程
    Discourse 数据分发
    Moodle 安装的时候提示 original IP
    Apache 安装运行测时候提示错误 (13)Permission denied: AH00091: httpd: could not open error log file
    Apache 配置 SELinux 命令的时候的命令 semanage
    Apache Httpd 安装 AH00558错误
    Discourse 如何修改用户自己的密码
    Discourse 如何限制注册用户的密码长度
    Discourse 的快捷键列表
    S3 存储附件和图片无法上传
  • 原文地址:https://www.cnblogs.com/henuliulei/p/9332367.html
Copyright © 2020-2023  润新知