5

我是正则表达式的菜鸟。

我有这样的字符串:-

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}

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

4

2 回答 2

6

您没有考虑.单词之间的中间值。\\w不包括dot(.).

您需要将模式更改为: -

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

dot(.)匹配一切,这就是你想要的,对吧?

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


更新: -

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

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

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

注意: -在这里,我使用[^}], 代替.+?. 它将匹配除 之外的任何字符}。所以,现在在这种情况下,你不需要reluctant量词。

\1用于backreferencing,但我们需要用反斜杠对其进行转义,因此\\1, 和(?!...)用于negative look ahead

于 2012-11-08T09:11:41.963 回答
1

也就是说,因为.不包含在\w. 然后您需要创建自己的角色类并将其添加到那里。

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

请参阅Regexr 上的模式。

但是,这并不能解决问题,即您不希望重复,但这不是正则表达式的工作。

如果大括号之间可以有更多不同的字符,那么Rohits 的答案会更好,这将匹配任何字符直到右括号。

于 2012-11-08T09:12:39.917 回答