今天要用正則表達式實現匹配一個詞出現一次或者不出現的狀況,可是又不單單是這麼簡單的需求。先詳細說下我這種狀況吧,也許有人也遇到這種狀況可是沒找辦法的時候能夠參考一下。html
若是對正則表達式基本用法還不太熟悉的同窗,能夠參考下菜鳥教程上正則表達式的簡單教程摸我直達。java
例如打開一個應用。字符串多是「open the qq」,「open qq」。「qq」是我想要獲得的內容,可是這個「the」怎麼辦呢。正則表達式
嘗試一
一開始我是這麼想的,把正則表達式寫成這樣「open the? ([A-Za-z]+[0-9]*)」
顯然這是不行的,否則我也不會寫這博客了(剛開始用正則表達式,因此你們別笑我這樣去試,哈哈),這樣只會匹配「the」中的「e」。express
嘗試二
我又寫了一個這樣的「open (the)? ([A-Za-z]+[0-9]*)」,而後這樣也是沒辦法知足個人需求的,由於這樣我經過捕獲組並不能正常的獲得相似「qq」這樣的應用名。由於「(the)?」也會被當成捕獲組干擾結果。此時的我很是頭大,怎麼辦呢怎麼辦呢。而後我又好好看了下菜鳥教程上正則表達式的各類語法。發現了下面這個語法。這簡直就是專門爲我這種狀況準備的啊,既能夠匹配單詞,又能讓他不佔據捕獲組的位置。
測試
嘗試三
而後我就進行了第三次嘗試,正則表達式是這樣的open (?:the)? ([A-Za-z]+[0-9]*)
忘了寫個人測試代碼了,加上spa
String regex = "open (?:the)? ([A-Za-z]+[0-9]*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher("open the qq"); if (matcher.find()) { System.out.println("find"); int i = matcher.groupCount(); System.out.println("i:" + i); for (int j = i; j <= i; j++) { System.out.println(matcher.group(j)); } }
而後結果是能夠的,終於能夠了。
而後我又試了下把輸入從「open the qq」改爲「open qq」
發生了啥,怎麼又不行了,我該怎麼辦,而後我又仔細看了下本身寫正則表達式,爲了可以看的更加清晰,我上個圖片。
紅色框的地方是兩空格字符,當我輸入是「open qq」的時候,實際上中間只有一個空格字符,因此是沒法與正則匹配的。而後我就把第二個空格改爲了「\s?」,此次完整的正則就是
open (?:the)?\s?([A-Za-z]+[0-9]*)
這樣無論是「open qq」仍是「open the qq」,我均可以順利獲得「qq」這個應用名。code