有時我們會很煩惱,怎樣獲取英文 " " 裡面的內容,因為英文的前後引號一樣,會造成很多麻煩:
例如:the name "mcdon ald's" is said "markudonarudo" in japanese
string input = "the name \"mcdon ald's\" is said \"markudonarudo\" in japanese";
pattern p = pattern.compile("\"(.+)\"");
//由於引號內可能存在空格以及其他除了"各種各樣的字元,我可以使用排除型字元組[^], 但我首先試一下 .+
matcher m = p.matcher(input);
int count = 0;
while(m.find())
結果為:
1----"mcdon ald's" is said "markudonarudo"
順著這條思路往下走,我發現我只是多匹配了一些字元,因為 .+ 可以匹配至少乙個字元,由於正則的貪婪特性,它從m開始將後面的所有的字元
到japanese的都全部匹配上了,但是由於
\"(.+)\"
最後還有個 " 結尾所以無法匹配,.+ 會讓出乙個字元讓 " 來匹配,如果匹配不上繼續讓出字元,直到匹配成功或者無法讓出宣告匹配失敗
那麼好吧,正則太貪婪了,正好有一種懶惰匹配,如示例中的:
string input = "the name \"mcdon ald's\" is said \"markudonarudo\" in japanese";
pattern p = pattern.compile("\"(.+?)\"");
//只要在+後面加上乙個簡單的?就可以的到正確的結果
matcher m = p.matcher(input);
int count = 0;
while(m.find())
.+?的意思是在匹配的前提下,盡可能少的匹配,怎麼樣理解盡可能少,如此例中,.+?本來可以像上乙個例子中,匹配一大串,但是由於後面有個?總是催促:「你匹配好了沒有,該我了吧?」,所以,.+心理很煩,變得很懶了,在第一「收尾的時候就停下來了,這樣就得到了正確的結果。
1----使用 .:"mcdon ald's"
2----使用 .:"markudonarudo"
現在看看這個懶惰的正規表示式:?放在括號外邊行不行,當然不可以,那樣?就成了最好匹配一次,即使不匹配也可以的元字元,所以懶惰的用法應該是緊跟著貪婪元字元的後面。
還有一點要注意的是使用環視的時候,由於環視不占用字元,只是占用位置
這樣會得到三個答案:
string input = "the name \"mcdon ald's\" is said \"markudonarudo\" in japanese";
pattern p = pattern.compile("(?<=\")(.+?)(?=\")");
//使用的是環視
matcher m = p.matcher(input);
int count = 0;
while(m.find())
(?<=")代表這個位置的左邊必須有乙個 」 ,既然正則不會占用 「 ,它只需要左邊是 」 右邊是什麼它不會管,這樣我們可以認為它占用了乙個什麼都不是的縫隙位置,這個縫隙位置只有乙個要求就是左邊是 」 ,(?=\")的意思是占用兩個字元之間的縫隙位置,縫隙位置的右邊是「 ,此時由於環視都不會占用字元,而縫隙只是理解,並不存在真正的縫隙,這樣匹配結束後的位置只是到達s 和 」之間的位置,下一次匹配的時候就會把 「 也匹配上
1----使用 .:mcdon ald's
2----使用 .: is said
3----使用 .:markudonarudo
所以使用環視有點不妥!
//還可以使用以下方式的排除環視
pattern p = pattern.compile("\"((?!\").)+\"");
//(?!\").的意思是乙個位置的右邊不能是" ,然後後面接了乙個. ,就是說.表示的其他字元都行,就是不能是"
grep正規表示式後面的單引號和雙引號的區別
單引號 是全引用,被單引號括起的內容不管是常量還是變數者不會發生替換 雙引號 是部分引用,被雙引號括起的內容常量還是常量,變數則會發生替換,替換成變數內容!一般常量用單引號 括起,如果含有變數則用雙引號 括起!單引號與雙引號的最大不同在於雙引號仍然可以保有變數的內容,但單引號內僅能是一般字 元 而不...
Oracle裡面的正規表示式函式
oracle 中的支援正規表示式的函式主要有下面四個 1,regexp like 與like的功能相似 2,regexp instr 與instr的功能相似 3,regexp substr 與substr的功能相似 4,regexp replace 與replace的功能相似 它們在用法上與orac...
C 正規表示式無法識別雙引號解決
1 aaaaaaaaaaaaaaaaaaaaaaaaaa2 想提取出ic交易網 1和2兩部分內容,需要用到正規表示式,按著一般情況,匹配字條串如下 s s 即字元中的雙引號前加轉義符 但是,你會發現匹配並不成功,但是把 改成雙引號就可以了,即匹配字串為 s s 也不知道為什麼,呵呵,能用就行了。想提...