我需要匹配或替换下面的字符串的一部分,但我无法在java中为其写出确切的正则表达式。
字符串:
library(plotrix)
polar.plot(1:36, seq(0,350,by=10), rp.type='s', point.col='blue')
预期的正则表达式应该与test3单独匹配,即。里面的任何东西"内部" $ {}。上面的示例有一个外部$ {...}和一个内部$ {...},比如... $ {... $ {...} ...} ....而test3在& #34;内部$ {}这就是我想要的。
以下正则表达式捕获$ {...}中的整个内容,而不仅仅是"内部"的内容。 $ {...}
text1${text2${text3}text4}text5
更多例子:
\$\{(.*?)\}
更新
text1${text2${text3}text4}text5 - match "text3"
text1text2${text3}text4text5 - should not match anything
text1${text2${text3}text4text5 - should not match anything
答案 0 :(得分:2)
.
与{
和}
相匹配。您需要排除匹配的{
和}
:
\$\{([^{}]*)}
^^^^^
请参阅regex demo。 [^{}]*
是除{
和}
之外的negated character class匹配的0 +字符。
String str = "text1${text2${text3}text4}text5";
Pattern p = Pattern.compile("\\$\\{([^{}]*)}");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group(1));
}
// => text3
答案 1 :(得分:0)
首先您需要匹配第一个{
和最后一个}
之间的整个内容,之后您可以匹配您想要的内容使用匹配组。
你想要什么
{.*\{(.*?)\}.*?\}
在第一步中,它匹配{text2${text3}
,然后你应该使用math-group
我不熟悉 Java ,但我对 Perl 和 C ++ 知之甚少,我认为它适用于 Java < / strong>因为它很容易而且不复杂
使用Perl进行测试
echo 'text1${text2${text3}text4}text5' | perl -lne '/\{.*\{(.*?)\}.*?\}/ && print $1'
<强>输出强>
text3
因此, Java 代码使用$1
代码。
对于您撰写的更新,您有两个选择一个,其中loop
超过您的字符串,其他四个match-group
首先使用while循环
echo 'text1${text2${text3}${text4}text5}' | perl -lne 'print $2 while /(\${)(\w+)(\$?})/g'
text3
text4
它是如何工作的?很容易。首先匹配${text3}
,此处\w+
将 text3 然后继续匹配${text4}
,再次\w+
将 text4 < / em>的
(\${)(\w+)(\$?})
prove
第二次使用非循环
echo 'your-string' | perl -lne ' /(\${)(\w+)(\$?})\1(\w+)\3/g && print $2," ",$4'
这个也很容易。它首先匹配 text3 ,然后匹配 text4 并将它们放入$2
和$4
。是的。
(\${)(\w+)(\$?})\1(\w+)\3
prove
注意强>
使用while循环你需要使用 g flag ,你不能忽略它,但第二个没问题
再次