2013-07-03 43 views
1

我是一個初學者使用正則表達式,我有像String1= "DELIVERY 'text1' 'text2'"string2="DELIVERY 'text1'"字符串,我想提取"text1"。我想這種模式提取字符串與正則表達式

Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'"); 
Matcher m2 = p.matcher(string); 

       if (m2.find()) { 

        System.out.println(m2.group(1)); 

        } 

結果是:text1' 'text2爲第二 第一串和text1我想這太

Pattern p = Pattern.compile("^DELIVERY\\s'(.*)'\\s'(.*)'"); 
Matcher m2 = p.matcher(string); 

        if (m2.find()) { 

         System.out.println(m2.group(1)); 

         } 

它僅適用於String1中

回答

5

你的第一個返回結果嘗試幾乎是正確的。只需更換:

.* 

有了:

.*? 

這使得運營商「非貪婪」,所以它會「吞掉」儘可能少的匹配文本越好。

+0

感謝它爲我工作:) – Mikou

+0

@Mikou如果它解決您的問題,您可以接受的解決方案: ) – Grimmy

0

如果你只是想有'text1',試試這個正則表達式:

"DELIVERY '([^']*)" 

或不進行分組:

"(?<=DELIVERY ')[^']*" 
+0

雖然它在這個例子中起作用,但我不會推薦使用這樣的文字空間。像「\ s +」這樣的東西幾乎總是更好,因爲它涵蓋了多個空格或製表符的可能性。 –

+0

感謝它的作品;) – Mikou

+0

@TomLord你是對的。我剛剛複製了字符串。我認爲這不是問題的關鍵。無論如何,你是對的。 – Kent

1

你的正則表達式.*是「貪婪」,並且消耗盡可能多的輸入地還仍然匹配,所以它會消耗從第一個到最後一個報價的所有內容。

加入?,即.*?古裝儘可能少但仍匹配,這會不會跳過艾弗報價改用relictant版本。

結合了一些Java功夫這種變化,你可以做到這一切在同一行:

String quoted = str.replaceAll(".*DELIVERY\\s'(.*?)'.*", "$1");