zoukankan      html  css  js  c++  java
  • 《Java核心技术卷二》笔记(三)正则表达式

    正则表达式语法

    一个正则表达式描述了字符串的构成规则(模式)。如果一个具体的字符串正好符合正则表达式描述的这个规则,这个字符串就是与表达式匹配的。先看一下怎么描述这种规则,也就是正则表达式语法。正则表达式类似于前面文章中的glob模式,但更加复杂和强大。

    此处只列出常用的语法,更复杂的可以查正则表达式的详细资料。

    正则表达式的构成元素:

    • 字符
      • 普通字符             与该字符自身匹配
      • unnnnxnn  n   nn  nnn        十六进制或十进制码元代表的字符
      •      f  a  e       控制字符:制表符,换行符,回车符,换页符,警告符,逃逸符
      • cc          与字符c相关的控制符
    • 字符类  
      • [c1c2c3...]        任何由ci表示的字符。 Ci可以是多个字符,或字符范围a-z A-Z 0-9,或其他字符类,(包含-字符本身时必须是第一项或最后一项,包含[字符时必须是第一项,包含^字符时不能作为第一项,只需要转义])。
      • [^...]       字符集的补集
      • [...&&...]     两个字符集的交集
    • 预定义字符类
      •  .         除了行终止符之外的所有字符(DOTALL标识被设置时,表示包括行终止符在内的所有字符)
      • d     数字,等效于[0-9]
      • D     非数字,等效于[^0-9]
      • s      空白字符,等效于[  fx0B]
      • S     非空白字符
      • w     词语字符,等效于[a-zA-Z0-9]
      • W    非词语字符
      • p{name}     命名字符类,name有以下值
        • Lower    ASCII小写字母[a-z]
        • Upper   ASCII大写字母[A-Z]
        • Alpha    ASCII字母[a-zA-Z]
        • Digit     ASCII数字[0-9]
        • Alnum   ASCII字母或数字[0-9a-zA-Z]
        • XDight   十六进制数字
        • Print|Graph  ASCII可打印字符[x21-x7E]
        • Punct    标点,即可打印的非字母非数字符号[p{print}&&P{Alnum}]
        • ASCII   所有ASCII[x00-x7F]
        • Cntrl   ASCII控制字符[x00-x1F]
        • Blank   空格字符或制表位[  ]
        • Space   空白字符[  fx0B]
        • javaLowerCase    Character.isLowerCase()确定的字符
        • javaUpperCase    Character.isUpperCase()确定的字符
        • javaWhiteSpace   Character.isWhitespace()确定的字符
        • javaMirrored    Character.isMirrored()确定的字符
        • Inxxxx    Unicode某个字符块中字符,xxxx是剔除空格后的字符块的名字,如Arrows, Latin1Supplement
        • Isxxxx    Unicode某个脚本字符,xxxx是剔除空格后的脚本名称,如Common
        • yyyy|Inyyyy    Unicode某个类别中字符,yyyy是类别名字,如L:字母,Sc:货币符号
        • Iszzzz     Unicode某个属性的字符(Alphabetic, Ideographic, Letter, LowerCase, Uppercase, Titlecase, Punctuation, Control, White_space,Digit, Hex_Digit, Noncharater_Code_point, Assigned)
      • P{name}     命名字符类的补集
    • 边界匹配字符
      • ^   $      输入的开头和结尾,如果设置多行模式则为行的开头和结尾
      •       词的边界
      • B     非词的边界
      • A     输入开头
      • z      输入的结尾
      •      除了行终止符之外的输入结尾
      • G     前一个匹配的结尾
    • 量词
      • X?     X可出现0次或1次(有没有都行)
      • X*     X可以出现0到无限次
      • X+     X可以出现1到无限次
      • X{n}   X{n,}   X{n,m}    X必须出现n次,n到无限次,n到m次
    • 量词后缀
      • ?       将默认匹配转变为勉强匹配。 
      • +      将默认匹配转变为占有匹配
    • 集合操作
      • XY    X的匹配后跟着Y的匹配
      • X|Y   任何X或Y的匹配
    • 群组
      • (X)    将X子表达式定义为群组,捕获群组匹配的字符串,群组的编号基于1,按左括号的顺序算,群组0代表匹配的所有字符
      •      反向引用第i个群组捕获的字符串。
    • 转义和其他
      • Q...E   逐字地引用...
      • (?...)    特殊结构

    量词的匹配模式

    • 默认模式:可匹配成功的最多重复次数;      [a-z]*b+ => caabb
    • ? 勉强匹配:匹配最小的重复次数;              [a-z]*?b+ => caabb
    • + 占用/贪婪匹配:匹配最大重复次数,即使后续的匹配会失败。    [a-z]*+b+ => caabb   b+匹配失败

    Java中使用正则表达式

    正则表达式用到Pattern,Matcher等类,String等类中也有方法可以快捷的使用正则表达式。正则表达式的字符串输入参数类型为CharSequence接口(CharArray, CharBuffer, String, StringBuffer, StringBuilder)

      Pattern

      • static Pattern compile(String regex)
      • static Pattern compile(String regex, int flags)    多个flags为相加,如Pattern.compile(regexStr, Pattern.DOTALL+Pattern.MULTILINE)。常用标识如下
        • CASE_INSENSITIVE    忽略大小写
        • UNICODE_CASE   与 CASE_INSENSITIVE组合时,使用Unicode字母的大小写匹配
        • MULTILINE     ^,$匹配行的开头和结尾而不是整个输入的开头和结尾
        • UNIX_LINES    多行模式时,行终止符为
        • DOTALL      '.'符合匹配所有字符,包括行终止符
        • CANON_EQ    考虑Unicode字符规范的等价性,不懂。。。
      • static String quote(String s)     预处理正则表达式字符串,取消所有特殊字符的意义并按普通字符匹配,返回处理后的表达式,(加QE)
      • String pattern()/toString()
      • int flags()   返回模式匹配标识
      • Matcher matcher(CharSequence input)    创建一个可以处理匹配的Matcher类
      • static boolean matches(String regex, CharSequence input)     返回整个input字符串是否和regex匹配
      • String[]  split(CharSequence input, int limit)     以满足this正则表达式的字符串为分隔字符将输入字符串切分,  limit表示需要切成几段(要切成n段,只需要切n-1次),limit为0表示全切,为1实际上不会切。
      • String[]  spilt(CharSequence input)

      Matcher

      • boolean matches()    输入字符串是否和Pattern正则表达式匹配整体匹配
      • boolean lookingAt()  输入字符串的开头部分是否匹配
      • boolean find()    尝试查找下一个匹配,如果找到了另一个匹配返回true,否则返回false。查找成功后,使用start,end,group等方法获取匹配信息。
      • boolean find(int start)  从字符串指定的偏移位置处开始查找下一个匹配
      • int start()    当前匹配的开始索引位置
      • int end()    当前匹配的结尾的后一个索引位置
      • String group()  返回当前匹配的子字符串, 等价group(0)
      • int groupCount()  返回群组的数量,(不算群组0,,即整个匹配字符串)
      • int start(int groupIdx)  返回某个群组的开始位置
      • int end(int groupIdx)    返回某个群组结尾的后一个索引位置
      • String group(int groupIdx)  返回某个群组捕获的字符串
      • String group(String name)    返回命名群组捕获的字符串
      • String replaceAll(String replacement)    replacement中可以包含$n表示对群组的引用,$表示$字符
      • String replaceFirst(String replacement)
      • static String quoteReplacement(String s)   预处理替代字符串(\和$前面添加\),使特殊字符按普通字符匹配
      • Matcher reset()    复位状态,可以重头在查找匹配
      • Matcher reset(CharSequence input)   切换输入字符串并复位状态
      • Matcher usePattern(Pattern newPattern)   切换模式
      • Matcher appendReplacement(StringBuffer sb, String replacement)   这两个appendxxx方法组合使用,替换时结果直接存入StringBuffer中
      • StringBuffer appendTail(StringBuffer sb)

     

        String   类中也提供了支持使用正则表达式的便捷方法

      • boolean matches(String regex)
      • String replaceFirst(String regex, String replacement)
      • String replaceAll(String regex, String replacement)
      • String[] split(String regex, int limit)
      • String[] split(String regex)
            String patternString="((\d{1,2}):(\d{1,2}))+";
            String inputString="start 12:43,  end 05:43";    
            Pattern pattern=Pattern.compile(patternString);
            Matcher matcher=pattern.matcher(inputString);
            System.out.println("total match: "+matcher.matches());
            int c=0;
            while(matcher.find())
            {
                System.out.println("match "+(++c)+": "+matcher.group());
                for(int i=1; i<=matcher.groupCount();i++)
                    System.out.println("	group "+i+": "+matcher.group(i));
            }
         Pattern p = Pattern.compile("cat");
            Matcher m = p.matcher("one cat two cats in the yard");
            StringBuffer sb = new StringBuffer();
            while (m.find()) {
                m.appendReplacement(sb, "dog");
            }
            m.appendTail(sb);
            System.out.println(sb.toString());
  • 相关阅读:
    Android发送信息模拟系统
    Android SharedPreferences
    Android中SQLiteDatabase操作【附源码】
    poj 2453
    pku 1020
    poj 2594 Treasure Exploration
    pku 2092 Grandpa is Famous
    zoj Weekend Party
    poj 3259 Wormholes
    poj 2455 Secret Milking Machine
  • 原文地址:https://www.cnblogs.com/pixy/p/4783719.html
Copyright © 2011-2022 走看看