正则表达式以获得匹配或替换subString

时间:2017-02-04 00:05:57

标签: java regex

我需要匹配或替换下面的字符串的一部分,但我无法在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

2 个答案:

答案 0 :(得分:2)

.{}相匹配。您需要排除匹配的{}

\$\{([^{}]*)}
     ^^^^^

请参阅regex demo[^{}]*是除{}之外的negated character class匹配的0 +字符。

Java code

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>因为它很容易而且不复杂

demo

使用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 ,你不能忽略它,但第二个没问题 再次