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

标签 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}

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

最佳答案

您没有考虑 .字之间。 \\w不包括 dot(.) .

您需要将模式更改为:-

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

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

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


更新:-

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

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

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

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

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

关于java - java中的正则表达式从给定字符串中查找类似${...}的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13285821/

相关文章:

java - 在 Android 5.0.1_r1 中将 Intent 从 C++ 发送到 Java

c# - 使用正则表达式查找具有随机顺序的可选组

javascript - 查找文本中的日期

java - 解析id的正则表达式

c# - 看似无辜的 .NET 正则表达式使页面响应时间增加 10 倍

JavaParser AnnotationExpr 获取参数

java - 为什么 getItem(position) 与新实例一起使用? (不应该为零?)

java - 在触摸监听器中执行工作,然后将其委托(delegate)给前一个监听器

Java - 我的代码中有一个额外的字符?

regex - htaccess 将 https 重定向到另一个 https