java中的正则表达式从给定的字符串中找到类似$ {...}的模式

时间:2012-11-08 09:09:57

标签: java regex

我是正则表达式的菜鸟。

我的字符串如下: -

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}

所以请建议我正确的正则表达式。

2 个答案:

答案 0 :(得分:6)

你没有考虑这个词之间的.\\w不包含dot(.)

您需要将模式更改为: -

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

dot(.)匹配所有内容,这就是你想要的吗?

另外,我在这里使用了reluctant量词 - .+?,因此它只匹配}之后的第一个{,因为如果你使用贪心量词{{1} }},(.+)也会匹配dot(.),直到找到最后一个}


更新: -

要获得唯一值,您可以使用以下模式: -

}

它只匹配那些模式,后面没有包含相同模式的字符串。

注意: - 在这里,我使用"(\\$\\{[^}]+\\})(?!.*?\\1)" 代替[^}]。它将匹配除.+?之外的任何字符。所以,现在在这种情况下,您不需要}量词。

reluctant用于\1,但我们需要使用反斜杠转义它,因此backreferencing\\1用于(?!...)

答案 1 :(得分:1)

多数民众赞成,因为.中未包含\w。您需要创建自己的character class,然后将其添加到那里。

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

查看模式here on Regexr

但是,这并没有解决问题,你不需要重复,但这不是正则表达式的工作。

如果大括号之间可能有更多不同的字符,那么Rohits answer会更好,它会匹配任何字符直到结束括号。