zoukankan      html  css  js  c++  java
  • 正则表达式

    正则表达式
        用于操作字符串的一个规则。
    正则表达式的规则采用了特殊的符号来表示
    预定义字符类
        . 任何字符(与行结束符可能匹配也可能不匹配)  常用
        d 数字:[0-9]  常用
        D 非数字: [^0-9]
        s 空白字符:[ x0Bf ]
        S 非空白字符:[^s]
        w 单词字符:[a-zA-Z_0-9] 常用
        W 非单词字符:[^w]
    Greedy 数量词
        X? X,一次或一次也没有
        X* X,零次或多次
        X+ X,一次或多次  
        X{n} X,恰好 n 次
        X{n,} X,至少 n 次      常用
        X{n,m} X,至少 n 次,但是不超过 m 次      常用
    范围表示(字符类 )
        [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](减去)
    Logical 运算符
        XY X 后跟 Y
        X|Y X 或 Y
        (X) X,作为捕获组

    边界匹配器
        ^ 行的开头
        $ 行的结尾
         单词边界
        B 非单词边界
        A 输入的开头
        G 上一个匹配的结尾
         输入的结尾,仅用于最后的结束符(如果有的话)
        z 输入的结尾

    代码测试如下:

     1 public class DemoRegex {
     2     public static void main(String[] args) {
     3         //匹配基本操作
     4         System.out.println("a".matches("."));
     5         System.out.println("1".matches("\d"));
     6         System.out.println("_".matches("\w"));
     7         
     8         //数量词基本使用
     9         System.out.println("aa".matches("a{2}"));
    10         System.out.println("aaaaaa".matches("a{2,}"));
    11         System.out.println("aaaaaa".matches("a{2,10}"));
    12         
    13         //范围表示基本使用
    14         System.out.println("z".matches("[abc]"));
    15         System.out.println("z".matches("[^abc]"));
    16         System.out.println("M".matches("[A-F]"));
    17         //组的基本操作
    18         System.out.println("1111".matches("([a-z|0-9])\1+"));
    19     }
    20 }
    View Code

    利用正则表达式常进行的操作:
    匹配:
      boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。

    代码示例如下:

     1 public class DemoRegex {
     2     //校验QQ号,规则:必须是5~15位数字,0不能开头。
     3     public static boolean isAvailableQQ(String qq) {
     4         return qq.matches("[1-9]\d{4,14}");
     5     }
     6     //检验手机号,规则: 第一位为1,第二位为34578的11位纯数字
     7     public static boolean isAvailableMobile(String mobile) {
     8         return mobile.matches("1[34578]\d{9}");
     9     }
    10     //校验固定电话,规则:区号-电话号(纯数字)  区号:首位为0 长度3-4     电话号:首位不能是0,长度7-8位
    11     public static boolean isAvailableTel(String tel) {
    12         return tel.matches("0\d{2,3}-[1-9]\d{6,7}");
    13     }
    14     //校验邮箱 
    15     //规则 前缀:字母数字下划线点短横线组成(长度不限)@字符数字下划线.(com|cn),并且.(com|cn)可重复出现
    16     public static boolean isAvailableEmail(String email) {
    17         return email.matches("[\w\.\-]+@\w+(\.(com|cn))+");
    18     }
    19     public static void main(String[] args) {
    20         //qq号校验
    21         String qq = "078a3687894";
    22         System.out.println("是否是合法的qq号:"+isAvailableQQ(qq));
    23         //手机号校验
    24         String mobile = "13781548649";
    25         System.out.println("是否是合法的手机号:"+isAvailableMobile(mobile));
    26         //固定电话校验
    27         String tel= "010-88888888";
    28         System.out.println("是否是合法的固定电话:"+isAvailableTel(tel));
    29         //邮箱校验
    30         String email = "1231564545@qq.com";
    31         System.out.println("是否是合法的邮箱:"+isAvailableEmail(email));
    32     }
    33 }
    View Code

    切割:
      String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。

    代码测试如下:

     1 public class DemoRegex {
     2     
     3     public static void main(String[] args) {
     4         //根据空格对一段字符串进行切割
     5         String spaceStr = "a b  cdef      d";
     6         String[] splitStr = spaceStr.split("\s+");
     7         System.out.println(Arrays.toString(splitStr));
     8         
     9         //任意重复字符进行切割
    10         //为了提高规则复用,用()进行封装,每一个括号都有一个编号,从1开始,为了复用这个规则。可以通过编号来完成该规则的调用。需要对编号数字进行转义。\1就代表获取1组规则。
    11         String charStr = "abbcdddeffffffffg";
    12         String[] splitStr2 = charStr.split("(.)\1+");
    13         System.out.println(Arrays.toString(splitStr2));
    14     }
    15 }
    View Code

    替换
      String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

    代码测试如下:

    1 public class DemoRegex {
    2     public static void main(String[] args) {
    3         //把任意重复字符替换成单一字符
    4         String charStr = "abbcdddeffffffffg";
    5         charStr = charStr.replaceAll("(.)\1+", "$1");
    6         System.out.println(charStr);
    7     }
    8 }
    View Code

    获取:
    获取需要使用到正则的两个对象:使用的是用正则对象Pattern 和匹配器Matcher。
    详细说明:
        指定为字符串的正则表达式必须首先被编译为Pattern类的实例。然后,可将得到的模式用于创建 Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
    用法:
        范例:
         Pattern p = Pattern.compile("a*b");
         Matcher m = p.matcher("aaaaab");
         boolean b = m.matches();
        步骤:
        1,先将正则表达式编译成正则对象。使用的是Pattern类一个静态的方法。compile(regex);
        2,让正则对象和要操作的字符串相关联,通过matcher方法完成,并返回匹配器对象。
        3,通过匹配器对象的方法将正则模式作用到字符串上对字符串进行针对性的功能操作
    Matcher类中常用的方法
    boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。
    String group() 返回由以前匹配操作所匹配的输入子序列。

    代码示例如下:

     1 public class DemoRegex {
     2     public static void main(String[] args) {
     3         //获取由3个字母组成的单词
     4         String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!";
     5         String reg = "\b[a-z]{3}\b";
     6         Pattern p = Pattern.compile(reg);
     7         Matcher m = p.matcher(str);
     8         while(m.find())
     9         {
    10             //在调用group时必须先调用find方法,否则可能会报违反规则异常
    11             System.out.println(m.group());
    12         }
    13 
    14     }
    15 }
    View Code
  • 相关阅读:
    file_get_contents抓取远程URL内容
    Xshell下VI打开文件中文乱码解决
    YII实现Memcache故障转移的配置办法
    Nginx实现多重IF判断的办法
    CentOS安装NodeJS v0.10.25 + Express
    一个小玩意 PHP实现微信红包金额拆分试玩
    Web Service测试利器 Postman
    CentOS安装Git
    PHP导出CSV UTF-8转GBK不乱码的解决办法
    configure: error: C++ compiler cannot create executables
  • 原文地址:https://www.cnblogs.com/nicker/p/6241164.html
Copyright © 2011-2022 走看看