正則表達式如何匹配一個單詞存在一次或零次而且不佔捕獲組位置

正則表達式如何匹配一個單詞存在一次零次而且不佔捕獲組位置

今天要用正則表達式實現匹配一個詞出現一次或者不出現的狀況,可是又不單單是這麼簡單的需求。先詳細說下我這種狀況吧,也許有人也遇到這種狀況可是沒找辦法的時候能夠參考一下。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

相關文章
相關標籤/搜索