Java 使用正则表达式替换子字符串的所有奇数

Java 使用正则表达式替换子字符串的所有奇数,java,regex,string,Java,Regex,String,我有一个字符串~~40~~摄氏温度:33摄氏温度:~~50~~ 我想替换子字符串“~~”的奇数出现,即第1个、第3个。。使用另一个字符串“**” 我的输出应该是**40~~摄氏温度:33摄氏温度:**50~~~ 如何用Java中的正则表达式实现这一点?我认为对于您的问题陈述,您不需要搜索奇数,从它显示的示例来看,您需要将~~(digit)替换为**(digit),而忽略其他格式的~~..您确实需要一个基本的解析器来处理这个问题;regex的设计目的不是计算这样的事件。下面代码的逻辑很简单。每次我

我有一个字符串
~~40~~摄氏温度:33摄氏温度:~~50~~

我想替换子字符串“~~”的奇数出现,即第1个、第3个。。使用另一个字符串“**”

我的输出应该是
**40~~摄氏温度:33摄氏温度:**50~~~


如何用Java中的正则表达式实现这一点?

我认为对于您的问题陈述,您不需要搜索奇数,从它显示的示例来看,您需要将~~(digit)替换为**(digit),而忽略其他格式的~~..

您确实需要一个基本的解析器来处理这个问题;regex的设计目的不是计算这样的事件。下面代码的逻辑很简单。每次我们比赛时,我们做两件事中的一件。如果是奇数出现,那么我们将空字符串附加到替换中,否则我们将重新结束匹配的
~

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~~

如果
~
严格成对出现,您可以使用捕获组的替换

private final static Pattern pattern = Pattern.compile("(?:~~([^~]+~~))");

public static String replaceOddTildes(String value) {
    return pattern.matcher(test).replaceAll("**$1");
}
以及:

请注意,如果不是成对匹配,它将错过最后一组奇数波浪形块:

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

替换匹配的是一对星号,后跟捕获组的内容。

有些人已经提出了类似的解决方案,但仍然:

String org = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~";
String rep = org.replaceAll("~~(\\d)","**$1");

在这里,
~(\d)
将搜索
~
,后跟数字,并替换为
**
,以保留第一个数字,使用
$1

这是regex的一个非常奇怪的用法。强烈地考虑使用类似于循环的东西来代替这个。(并不是所有的任务都可以使用正则表达式完成。)是否保证始终有偶数个任务?如果它们不是成对的,如果它失败或错过最后一个,可以吗?下层选民是否愿意解释或提出改进建议?您应该将其替换为
“**”
,以符合OP的要求,但如果只需要替换成对,则不需要计算发生次数。@DavidConrad我不同意您的逻辑,因为谁说我们将永远拥有成对的
~
。实际上,我们在这里想要的实际替换逻辑是迭代,替换所有奇数出现,有或没有一对,因此…由于OP没有指定,所以不清楚OP希望对不匹配的对执行什么操作。在我看来,这很可能是非法的,应该被忽视。在OP澄清之前,什么都不能说。
String org = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~";
String rep = org.replaceAll("~~(\\d)","**$1");