繁体   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