簡體   English   中英

java中的正則表達式從給定的字符串中找到類似$ {...}的模式

[英]Regex in java to find pattern like ${…} from given string

我是正則表達式的菜鳥。

我有這樣的字符串: -

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}

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

你不是在考慮. 在這個詞之間。 \\\\w不包括dot(.)

您需要將模式更改為: -

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

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

另外,我在這里使用了reluctant量詞 - .+? 所以它只匹配}之后} { ,因為如果你使用貪婪量詞(.+)dot(.)也會匹配} ,直到它找到最后一個}


更新: -

要獲得唯一值,您可以使用此模式: -

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

它將僅匹配那些不包含相同模式的字符串的模式。

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

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

多數民眾贊成是因為. 未列入\\w 您需要創建自己的角色類,然后將其添加到那里。

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

請參閱Regexr上的模式。

但是,這並沒有解決問題,您不需要重復,但這不是正則表達式的工作。

如果大括號之間可能有更多不同的字符,那么Rohits的答案會更好,這將匹配任何字符直到結束括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM