java中的正则表达式从给定字符串中查找类似${…}的模式
我是雷杰克斯的不速之客 我有这样的字符串:-java中的正则表达式从给定字符串中查找类似${…}的模式,java,regex,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} ${reg
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不包括点(.)
您需要将模式更改为:-
PLACEHOLDER_PATTERN = "\\$\\{.+?\\}";
dot(.)
匹配所有内容,这就是您想要的,对吗
另外,我在这里使用了不情愿的
量词-+?
,这样它只匹配{
之后的第一个}
,因为如果你使用贪婪的量词(.+)
,点(.)
也会匹配}/code>,直到找到最后一个
更新:-
要仅获取唯一值,可以使用以下模式:-
"(\\$\\{[^}]+\\})(?!.*?\\1)"
它将只匹配那些模式,后面不跟包含相同模式的字符串
注意:-在这里,我使用了[^}]
来代替?
。它将匹配除}
以外的任何字符。因此,在本例中,您不需要不情愿的
量词
\1
用于反向引用
,但我们需要用反斜杠将其转义,因此\\1
,(?!…)
用于负向前瞻
也就是说,因为
不包括在\w
中。您需要创建自己的,然后添加到那里
PLACEHOLDER_PATTERN = "\\$\\{[\\w.]+\\}";
看看这个模式
但是,这并不能解决问题,即您不需要重复,但这不是正则表达式的工作
如果在花括号之间可以有更多不同的字符,那么最好是匹配任何字符,直到结束括号。因为“dreamworks.values”包含一个。在IT中,这是什么字符串提要
?您能再解释一下吗?String feed=“sip${dreamworks.values}print${fwVer}to${fwVer}使用${lang}en${lang}给定${region}中的${model}”;请参阅给定示例中重复字符串馈送的另一种情况。您可以将所有匹配的字符串添加到集合中。它将自动为您删除重复项。@user1808653。。您可以尝试更新的模式。它将为您提供唯一的值。@jlordo,而不是在字符类中。有一个点就是一个点,没有什么特别的。@stema-你说得对,谢谢你的回答,每天学习新东西:)