我是正则表达式的菜鸟。
我的字符串如下: -
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}
所以请建议我正确的正则表达式。
答案 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会更好,它会匹配任何字符直到结束括号。