我有一个字符串~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~
我想替换子串的奇怪出现' ~~'即第1,第3 ..用另一根字符串' **'。
我的输出应为**40~~ Celsius Temp: 33 Celsius Temp:**50~~
如何使用Java中的regex实现这一目标?
答案 0 :(得分:1)
你真的需要一个基本的解析器来处理这个问题;正则表达式不是为计算这样的事件而设计的。下面代码的逻辑很简单。每当我们点击一场比赛~~
时,我们会做两件事之一。如果它是奇怪的,那么我们将空字符串附加到替换,否则我们将重新匹配我们匹配的~~
。
String input = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~";
Pattern p = Pattern.compile("~~");
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer(input.length());
int i = 0;
while (m.find()) {
if (i % 2 == 0) {
m.appendReplacement(sb, "**");
}
else {
m.appendReplacement(sb, m.group(0));
}
++i;
}
m.appendTail(sb);
System.out.println(sb.toString());
**40~~ Celsius Temp: 33 Celsius Temp:**50~~
答案 1 :(得分:0)
我认为对于你的问题陈述,你不需要搜索奇怪的事件,从它显示的例子中,你需要用**(数字)替换~~(数字)并忽略其他格式的~~ .. < / p>
答案 2 :(得分:0)
有些人已经提出类似的解决方案,但仍然:
String org = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~";
String rep = org.replaceAll("~~(\\d)","**$1");
在此处,~~(\d)
会搜索~~
后跟数字,并替换为**
,以使用$1
答案 3 :(得分:-2)
如果~~
严格成对出现,您可以使用替换捕获组。
private final static Pattern pattern = Pattern.compile("(?:~~([^~]+~~))");
public static String replaceOddTildes(String value) {
return pattern.matcher(test).replaceAll("**$1");
}
和
String result = replaceOddTildes("~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~"));
请注意,如果它们不在匹配对中,它将错过最后一组奇数:
replaceOddTildes("An ~~un~~ paired ~~example!").equals("An **un~~ paired ~~example!")`
如果这就是你想要一个不匹配的一对被处理的方式,那么那很好。
详细模式:
(?: a non-capturing group, consisting of
~~ a pair of tildes, followed by
( a capturing group, consisting of
[^~]+ one or more characters that is not a tilde, followed by
~~ a pair of tildes
) end of the capturing group
) end of the non-capturing group
匹配的替换是一对星号,后跟捕获组的内容。