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

    java中的正则表达式内容比较多又比较杂,记录下常用的。

    用到的包是java.util.regex包里面只有两个类 :pattern、matcher和一个异常(runtimeexception)类。

    典型的调用顺序是:

     Pattern p = Pattern.compile("a*b");

     Matcher m = p.matcher("aaaaab");

     boolean b = m.matches();

    其中:Pattern将正则表达字符串编译封装,然后调用matcher函数返回一个存放了结果的Matcher匹配器,Matcher里面有很多的方法,根据要求的不同可以返回不同的结果,而matches是全部匹配,返回布尔值。

    匹配:

    x : 字符

    \ : 反斜线

    XX : 八进制的开头XX

    xhh : 16进制的开头hh

    字符类:

    [abc] : a或b或c

    [^abc] : 除了abc的任何字符

    [a-zA-Z] : a到z或者A到Z,包含两端。

    [a-d[m-p]] : a到d或m到p

    [a-z&&[def]] : d 或 e 或 f

    [a-z&&[^bc]] : a到z但是不包含bc

    [a-z&&[^m-p]] : a到z但是不包含m到p

    预定义字符类:

    . : 任何字符

    d : 数字[0-9]

    D : 非数字

    s : 空白字符

    S : 非空白字符

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

    W : 非单词字符

    边界匹配:

    ^ : 行的开头

    $ : 行的结尾

     : 单词边界

    greedy数量词

    X? : 一次或零次

    X* : 零次或多次

    X+ : 一次或多次

    X{n} : 恰好n次

    X{n,} : 至少n次

    X{n,m} : 至少n次,但是不超过m次,两面都包含.

     反斜线、转义的引用

    反斜线( )用于转义,X : 将字面转义,在不表示转义构造的任何字符前使用反斜线都是错误的;他们是为将来扩展正则表达式语言保留的.因此使用的时候要注意,如果是表示转义的字符,则用一个反斜线,如果是用正则表达式中本来就有的反斜线,应该用两个\表示转义后的一个.

    比如:

    复制代码
    1 String str1 = ".123";
    2 String str2 = "zhang.wang.li.zhao";
    3
    4 SOP.sop(str1.matches("\.[1-9]*"));
    5 String[] arr = str2.split("\.");
    6 for(String s : arr){
    7 SOP.sop(s);
    8 }
    复制代码

    组和捕获

    (....) 表示一个组,捕获组可以通过从左到右计算开括号来编号,组零始终表示整个代表式. 之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列.组的编号出现的第一个左括号为第一组,通过1来调用第一组。

    例如:

    复制代码
    1 String str1 = "aba";
    2 SOP.sop(str1.matches("(a(b)?)+"));
    3
    4 String str2 = "asfdadasdadiohggqp";//去掉形如“XaX”的
    5 String[] arr = str2.split("(.)a\1");//通过1调用第一组
    6 for(String s : arr){
    7 SOP.sop(s);
    8 }
    复制代码

    在Matcher中,find为查找是否有匹配的,group为按照find的结果写出对应的组,0组为整个匹配。reset为重置匹配器。

    1 Pattern p = Pattern.compile("\w(\d)");
    2 Matcher m = p.matcher("asa9c8eet99r");
    3 while(m.find()){
    4 SOP.sop(m.group(1));//这时候是打印第一组,也就是数字那组。
    5 }

    最后附上在入学测试的时候,用正则表达式解决的一道题目:编写程序获取已知文件的扩展名. 注意: abc.txt的扩展名是txt, abc.java.txt的扩展名也是txt。

    复制代码
     1 import java.io.File;
    2 import java.util.regex.*;
    3
    4 public class TestRegex2 {
    5 public static void main(String[] args ){
    6 File f = new File("c:/aa/aas/abc.txt.java.com");
    7 System.out.println(getName(f));
    8 }
    9 static String getName(File f){
    10 String name = f.getAbsolutePath();
    11 System.out.println(name);
    12 Pattern p = Pattern.compile("\.[a-zA-Z]*$");//假定后缀名只能为字母
    13 Matcher m = p.matcher(name);
    14 String result = "";
    15 while(m.find()){
    16 result = m.group();
    17 }
    18 return result;
    19 }
    20 }
  • 相关阅读:
    福大软工 · 第七次作业
    git分支重命名
    vscode左侧文件不同颜色标识含义
    正则表达式匹配指定字符区间的内容,且不包含指定字符
    git如何撤销工作区的修改
    git查看某个文件的提交历史
    扫盲篇--远程桌面连接
    git merge后如何撤销
    element-ui+vue-treeselect校验
    typeof 踩坑总结
  • 原文地址:https://www.cnblogs.com/lxl57610/p/5846129.html
Copyright © 2011-2022 走看看