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");