美文网首页
Java-0007-正则表达式

Java-0007-正则表达式

作者: 云转水流 | 来源:发表于2016-07-16 22:49 被阅读49次

    2016.7.15

    slipt(String regex)和replaceAll(String regex,String replacement)

    上面是拼接字符串时常用的两种方法,它们的匹配参数字符串都是正则表达式的字符串,regex就是正则表达式。

    处理字符串的时候,如果能够灵活熟练的使用正则表达式,就可以很方便的对程序表达出你的匹配逻辑,而不用写一大堆逻辑判断、复杂处理,还很容易出错和匹配不全。

    正则表达式中一些字符已经被赋予了特殊的含义,想要匹配他们就要使用转义字符。

    例如想匹配+加号,就需要用\+,但是我们又是用字符串来输入这个正则表达式,字符串中\也是转义字符,所以我们需要用\\来表示\,即匹配+加号,我们需要用\\+。

      //当代码为
      String str = "abc+xyz";
      str=str.replaceAll("+", "-");
      System.out.println(str);
      //运行结果为异常
      Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0
    

      //当代码为
      String str = "abc+xyz";
      str=str.replaceAll("\\+", "-");
      System.out.println(str);
      //运行结果为
      abc-xyz
    

    例如你想替换字符串"This is good."中的"is"单词为"is not",那显然不能直接匹配"is"。
    如果用一般的逻辑去写,首先要检查是否存在"is"单词,这就要考虑它的前后是否全为非字母或没有字符;
    然后最好要一起替换所有的"is",但显然很难一起替换,那就依次替换,依次替换就需要有所有"is"单词的索引,替换一次后字符串长度又会变,索引也要相应的增长;
    替换完后,返回新的字符串。

    这样是不是感觉很麻烦,脑子有点混乱。
    如果我们用上正则表达式就很不一样了,会轻松很多。

      return str.replaceAll("\\bis\\b", "is not");
    

    \b代表了一个单词的边界,我们将它们组合起来\bis\b就是is单词了,以为以字符串输入,所有要在转义把\一下,regex就是"\\bis\\b".
    看,是不是逻辑很清晰,方法很简单。
    当然前提是你能组合出组合匹配条件的正则表达式。

    一些常用的转义字符


    转义字符 意义
    \+ 加号
    \.
    \? 问号
    \* 星号
    \\ 反斜杠
    \( \) 圆括号
    \[ \] 方括号
    \{ \} 大括号
    竖线
    \$ 美元
    \^ 乘方
    \t 间隔 ('\u0009')
    \n 换行 ('\u000A')
    \r 回车 ('\u000D')
    \d 数字 等价于 [0-9]
    \D 非数字 等价于 [^0-9]
    \s 空白符号 [\t\n\x0B\f\r]
    \S 非空白符号 [^\t\n\x0B\f\r]
    \w 单独字符 [a-zA-Z_0-9]
    \W 非单独字符 [^a-zA-Z_0-9]
    \f 换页符
    \e Escape
    \b 一个单词的边界
    \B 一个非单词的边界
    \G 前一个匹配的结束

    ^ 为限制开头

    ^java  条件限制为以 Java 为开头字符

    $ 为限制结尾

    java$  条件限制为以 java 为结尾字符

    . 为限制除 \n 以外任意一个单独字符

    java..  条件限制为 java 后除换行外任意两个字符

    加入特定限制条件「 [] 」

    [a-z]    条件限制在小写 a to z 范围中一个字符
    [A-Z]    条件限制在大写 A to Z 范围中一个字符
    [a-zA-Z]   条件限制在小写 a to z 或大写 A to Z 范围中一个字符
    [0-9]    条件限制在小写 0 to 9 范围中一个字符
    [0-9a-z]   条件限制在(小写 0 to 9 或 a to z )范围中一个字符
    [0-9[a-z]]  条件限制在(小写 0 to 9 )或 (小写 a to z )范围中一个字符 ( 交集 )

    [] 中加入 ^ 后加再次限制条件「 [^] 」

    [^a-z]    条件限制在非小写 a to z 范围中一个字符
    [^A-Z]    条件限制在非大写 A to Z 范围中一个字符
    [^a-zA-Z]  条件限制在非小写 a to z 或大写 A to Z 范围中一个字符
    [^0-9]    条件限制在非小写 0 to 9 范围中一个字符
    [^0-9a-z]  条件限制在非(小写 0 to 9 或 a to z )范围中一个字符
    [^0-9[a-z]]  条件限制在(非小写 0 to 9 )或 (小写 a to z )范围中一个字符 ( 交集 )

    在限制条件为特定字符出现 0 次以上时,可以使用「 * 」

    J*   0 个以上 J
    .*   0 个以上任意字符
    J.*D  J 与 D 之间 0 个以上任意字符

    在限制条件为特定字符出现 1 次以上时,可以使用「 + 」

    J+   1 个以上 J
    .+   1 个以上任意字符
    J.+D  J 与 D 之间 1 个以上任意字符

    在限制条件为特定字符出现有 0 或 1 次以上时,可以使用「 ? 」

    JA?   J 或者 JA 出现

    限制为连续出现指定次数字符「 {a} 」

    J{2}  JJ
    J{3}  JJJ

    字符连续出现a个及以上 「 {a,} 」

    J{3,}  JJJ,JJJJ,JJJJJ,??? (3 次以上 J 并存 )

    字符连续出现a个及以上,b及个以下 「 {a,b} 」

    J{3,5}  JJJ 或 JJJJ 或 JJJJJ

    两者取一 「 | 」

    J|A      J 或 A
    Java|Hello  Java 或 Hello

    学习文章:关于java中split的使用
    学习文章:java 需要转义的一些特殊符号。
    学习文章:JAVA中转义字符


    相关文章

      网友评论

          本文标题:Java-0007-正则表达式

          本文链接:https://www.haomeiwen.com/subject/jymujttx.html