2012-11-08 21 views
5

我是一個正則表達式的noob。

我有串,如: -

String str = "sbs 01.00 sip ${dreamworks.values} print ${fwVer} to 
       used ${lang} en given ${model} in ${region}"; 

和 我要提取這種類型$ {....}匹配所有的模式

,如: - 對於給定的STR結果應該是

${dreamworks.values} 
${fwVer} 
${lang} 
${model} 
${region} 

進一步如果它發現任何重複,則只給出一個。 爲前: -

String feed = "sip ${dreamworks.values} print ${fwVer} to ${fwVer} used 
       ${lang} en ${lang}given ${model} in ${region}" 

的結果應該是: -

${dreamworks.values} 
${fwVer} 
${lang} 
${model} 
${region} 

只有

這就是我的回答: -

PLACEHOLDER_PATTERN = "\\$\\{\\w+\\}"; 

但是這一次不給正確的結果。 它僅給出

${fwVer} 
${lang} 
${model} 
${region} 

所以,請建議我正確的正則表達式。

+1

因爲 「dreamworks.values」 包含。在其中 –

回答

6

您不在考慮.這個詞。不包括。

您需要將您的模式更改爲: -

PLACEHOLDER_PATTERN = "\\$\\{.+?\\}"; 

dot(.)匹配的一切,這是你想要的嗎?

而且,我在這裏使用reluctant量詞 - .+?,使其只匹配{後的第一},因爲如果你使用一個貪婪的量詞(.+)dot(.)也將在道路匹配},直到找到最後}


更新: -

得到公正的唯一值,您可以使用此模式: -

"(\\$\\{[^}]+\\})(?!.*?\\1)" 

它將匹配只有那些模式,這是後面沒有包含相同模式的字符串。

注: -在這裏,我已經使用[^}],代替.+?。它將匹配除}以外的任何字符。所以,現在在這種情況下,你不需要一個reluctant量詞。

\1用於backreferencing,但我們需要用反斜線轉義,因此\\1(?!...)用於negative look ahead

+0

但是對於字符串Feed呢?我如何獲得獨特的價值。 – user1808653

+0

這是什麼'String Feed'?你能多解釋一下嗎? –

+0

字符串進料= 「SIP $ {dreamworks.values}打印$ {fwVer}爲$ {fwVer}使用$ {郎}烯$ {郎}給出$ {模型}在$ {區域}」;在給定示例中,請查看其他情況下的重複字符串提要。 – user1808653

1

那是,因爲.\w包括在內。您需要創建自己的character class然後將其添加到那裏。

PLACEHOLDER_PATTERN = "\\$\\{[\\w.]+\\}"; 

查看模式here on Regexr

然而,這並不能解決問題,要沒有重複,但不是正則表達式的工作。

如果有可能是大括號之間有更多不同的角色,然後Rohits answer較好,這將匹配直到右括號的任何字符。

+0

未轉義的'.'也會與你的貪婪量詞相匹配...... – jlordo

+1

@jlordo,不屬於角色類。有一個點只是一個點,沒有什麼特別的。 – stema

+0

@stema - 你是對的,謝謝你的回答,每天都在SO上學習新的東西:) – jlordo

相關問題