2

基本上我需要在 java 中的字符串中检索 <> 或 {} 块中的数据。

字符串可能包含也可能不包含 <> 或 {} 标记。

该字符串可能包含多个 <> 或 {} 块。

<> 和 {} 块中的数据基本上是变量或函数名称。

    d1 = "1234";
    d2 = "5678";
    sampleString = "aaa<d1>aaa{d1}aaa<d2>aaa";

我需要结果类似于这样的东西。

    resultString = "aaa1234aaa4321aaa5678aaa";

提前致谢。:)

编辑

我应该注意 <> 和 {} 块内的值是动态的。

我本可以有

    sampleString = "aaa<d5>aaa{d1}aaa<d2>aaa";

这意味着它将从属性/变量/参数/等中获取值 d5。

我应该从一开始就说明这一点。:p

4

5 回答 5

2

好吧,这是一个经典的正则表达式任务,您可以使用 Java 中的 Pattern 和 Matcher 来解决。首先,考虑一下无论 Java 实现如何都需要捕获此字符串的正则表达式。类似的东西"(?:.*<(.*?)>.*)|(?:.*{(.*?)}.*)"应该可以帮助您捕获字符串。您可以使用 Matcher 进行匹配并在 while 循环中运行,而 Matcher 的 .find() 方法不返回 NULL(即字符串中仍有匹配项)。在循环中替换所需的组。

于 2012-07-04T06:25:25.063 回答
1
    String d1 = "1234";
    String d2 = "5678";
    String sampleString = "aaa<d1>aaa{d1}aaa<d2>aaa";
    String finalStirng= sampleString.replaceAll("<d1>", d1).replaceAll("\\{d1\\}", d1).replaceAll("<d2>", d2).replaceAll("\\{d2\\}", d2);
    System.out.println("finalStirng= " + finalStirng);

{ 和 } 在 Java 的正则表达式方言中是特殊的。所以你应该逃避它们: as "\\{d1\\}".

于 2012-07-04T06:29:00.057 回答
1

Map首先,为您的价值观创建一个:

Map<String, String> values = new HashMap<String, String>();
values.put("d1", "1234");
values.put("d2", "5678");

然后,找到所有匹配项并替换它们:

Matcher matcher = Pattern.compile("<(.*?)>").matcher(text);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(sb, values.get(matcher.group(1)));
}
matcher.appendTail(sb);

又是另一种模式:

matcher = Pattern.compile("\\{(.*?)\\}").matcher(sb.toString());
sb = new StringBuffer();
while (matcher.find()) {
      matcher.appendReplacement(sb, new StringBuffer(values.get(matcher.group(1))).reverse().toString());
}
matcher.appendTail(sb);
于 2012-07-04T06:34:31.800 回答
0

试试这个

sampleString = sampleString.replaceAll("<d1>",d1).replaceAll("{d1}",new StringBuffer(d1).reverse().toString()).replaceAll("<d2>",d2);
于 2012-07-04T06:22:05.420 回答
0

一种直接的方法是使用前面提到的正则表达式

String resultString = "";  
resultString = sampleString.replaceAll("<d1>",d1);  
resultString = resultString.replaceAll("\\{d1\\}",d1);  
resultString = resultString.replaceAll("<d2>",d2);  

请注意,这适用于您描述的特定场景(尽管未经测试),但不适用于一般场景,因为 <> 或 {} 标签之间的字符可能会影响正则表达式。这取决于您的 <> 或 {} 标签之间的内容。

考虑使用像 <.*> 这样的东西作为你的正则表达式条件可能会更好......

于 2012-07-04T06:31:51.153 回答