基本上我需要检索<>内的数据或者{}阻止java中的字符串。
字符串可能包含也可能不包含<>或{}标记。
该字符串可能包含多个<>或{}阻止。
<>内的数据和{}块基本上是变量或函数名。
d1 = "1234";
d2 = "5678";
sampleString = "aaa<d1>aaa{d1}aaa<d2>aaa";
我需要结果与此类似。
resultString = "aaa1234aaa4321aaa5678aaa";
提前谢谢。 :)
修改
我应该注意&lt;&gt;里面的值和{}块是动态的。
我可以
sampleString = "aaa<d5>aaa{d1}aaa<d2>aaa";
意味着它将从属性/变量/参数/等获得值d5。
我应该从一开始就说过。 :P
答案 0 :(得分:2)
嗯,这是一个经典的正则表达式任务,您可以使用Java中的Pattern和Matcher解决这个问题。
首先,考虑一下无论Java实现如何都需要捕获此字符串的正则表达式。
某种类型"(?:.*<(.*?)>.*)|(?:.*{(.*?)}.*)"
应该可以帮助您捕获字符串。
您可以使用Matcher进行匹配并在while循环中运行,而Matcher的.find()方法不返回NULL(即字符串中仍然存在匹配)。
在循环中替换所需的组。
答案 1 :(得分: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正则表达方言中很特别。所以你应该逃避它们:"\\{d1\\}"
。
答案 2 :(得分: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);
答案 3 :(得分:0)
尝试这个
sampleString = sampleString.replaceAll("<d1>",d1).replaceAll("{d1}",new StringBuffer(d1).reverse().toString()).replaceAll("<d2>",d2);
答案 4 :(得分:0)
直接方法是使用前面提到的正则表达式
String resultString = "";
resultString = sampleString.replaceAll("<d1>",d1);
resultString = resultString.replaceAll("\\{d1\\}",d1);
resultString = resultString.replaceAll("<d2>",d2);
请注意,对于您所描述的特定情况,这可能会有效(虽然未经测试),但并非通用情景作为&lt;&gt;之间的字符。或{}标签可能会影响正则表达式。这取决于你的&lt;&gt;之间的关系。或{}标签。
最好考虑使用像&lt;。*&gt;这样的东西。作为你的正则表达式条件...