正規表示式兩三事

weixin_33861800發表於2018-12-28

總結幾個正規表示式平時使用過程中表的疑惑點,總結結果如下:

1. 正規表示式為什麼需要兩個 \. 來表示.或者正規表示式中為什麼\需要四個\來表示\\

\.(jpg|png|bmp|gif) 上面這個正規表示式為什麼有兩個反斜槓呢?反斜槓點.就能表示點.了,為什麼還要在.前面多加一個\?

答案:這要分兩步看 首先字串中的\被編譯器解釋為
然後作為正規表示式,.又被正規表示式引擎解釋為.

如果在字串裡只寫.的話,第一步就被直接解釋為.,之後作為正規表示式被解釋時就變成匹配任意字元了

2.Java正則Matcher類的matches()、lookAt()和find()的區別?

網上類似的部落格很多,但是看他們的說法實驗結果各異,於是我自己測了一把,得出如下結論。

在Matcher類中有matches、lookingAt和find都是匹配目標的方法,但容易混淆,整理它們的區別如下:

  • matches: 整個匹配,只有整個字元序列完全匹配成功,才返回True,否則返回False。但如果前部分匹配成功,將移動下次匹配的位置。
  • lookingAt: 部分匹配,總是從第一個字元進行匹配,匹配成功了不再繼續匹配,匹配失敗了,也不繼續匹配。
  • find: 部分匹配,從當前位置開始匹配,找到一個匹配的子串,將移動下次匹配的位置。
  • reset: 給當前的Matcher物件配上個新的目標,目標是就該方法的引數;如果不給引數,reset會把Matcher設到當前字串的開始處。

測試程式碼:


    private void regexTest(){
        Pattern pattern = Pattern.compile("\\d{3,5}");
        String charSequence = "123-34345-234-00";
        Matcher matcher = pattern.matcher(charSequence);

        //雖然匹配失敗,但由於charSequence裡面的"123"和pattern是匹配的,所以下次的匹配從位置4開始
        Log.e("regex",""+matcher.matches());
        //測試匹配位置
        matcher.find();
        Log.e("regex",""+matcher.start());

        //使用reset方法重置匹配位置
        matcher.reset();

        //第一次find匹配以及匹配的目標和匹配的起始位置
        Log.e("regex",""+matcher.find());
        Log.e("regex",""+matcher.group()+" - "+matcher.start());
        //第二次find匹配以及匹配的目標和匹配的起始位置
        Log.e("regex",""+matcher.find());
        Log.e("regex",""+matcher.group()+" - "+matcher.start());

        //第一次lookingAt匹配以及匹配的目標和匹配的起始位置
        Log.e("regex",""+matcher.lookingAt());
        Log.e("regex",""+matcher.group()+" - "+matcher.start());

        //第二次lookingAt匹配以及匹配的目標和匹配的起始位置
        Log.e("regex",""+matcher.lookingAt());
        Log.e("regex",""+matcher.group()+" - "+matcher.start());

        //使用reset方法重置匹配位置
        matcher.reset();
        //遍歷所有匹配的子串
        while(matcher.find()){
            Log.e("regex",""+matcher.group()+" - "+matcher.start());
        }

    }
複製程式碼

測試結果:

2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: false
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 0
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: true
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 123 - 0
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: true
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 34345 - 4
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: true
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 123 - 0
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: true
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 123 - 0
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 123 - 0
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 34345 - 4
2018-12-28 14:55:40.675 15023-15023/com.kdgw.weifeng.runnumber E/regex: 234 - 10

複製程式碼

相關文章