總結幾個正規表示式平時使用過程中表的疑惑點,總結結果如下:
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
複製程式碼