java - 在半索引实例处查找并替换

标签 java regex

我的文本和正则表达式看起来像这样

String text = "dummy:10.45someObjectdummy:10.67somethingdummy:10.78somethingdummy:10.98djd";
String regex = "dummy:(\\d+\\.\\d+)";

在这里,我得到了正则表达式的四个匹配项。总会有比赛的事件编号。我想比较上半年和下半年的总和。如果上半部分的总和小于下半部分,则在上半部分添加 1.00 否则在下半部分添加 1.00

在这种情况下,上半场总和为 10.45 + 10.67。
下半场总和为10.78 + 10.98。

所以我们将在 10.67 中添加 1.00,我们的最终字符串将是

String text = "dummy:10.45someObjectdummy:11.67somethingdummy:10.78somethingdummy:10.98djd";

这是我试过的。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* Name of the class has to be "Main" only if the class is public. */
class MatcherTest
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        String text = "dummy:10.45someObjectdummy:10.67somethingdummy:10.78somethingdummy:10.98djd";
        String regex = "dummy:(\\d+\\.\\d+)";

        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(text);
        List<Double> itemList = new ArrayList<>();

        while (matcher.find()) {
            System.out.println("Match: " + matcher.group(1));
            itemList.add(Double.parseDouble(matcher.group(1)));
        }


    }
}

现在我有了 itemList,我可以根据如何替换第 2 项或第 4 项来检查哪个部分更大。 ? 请注意,总共可以有 6、8 个项目。所以我们需要相应地更换。

最佳答案

由于您需要知道字符串中有多少匹配项,因此您需要 1) 获取所有匹配项,以及 2) 执行所有必要的操作,以及 3) 将正确的匹配项替换为更新后的值。

这是一个quick Java demo您可以进一步增强:

String s = "dummy:10.45someObjectdummy:10.67somethingdummy:10.78somethingdummy:10.98djd";
Matcher m = Pattern.compile("dummy:(\\d+\\.\\d+)").matcher(s);
List<Double> vals = new ArrayList<>();
while (m.find()){
    vals.add(Double.parseDouble(m.group(1)));  // Collecting matches
} 
int val_id = vals.size() / 2 - 1;           // Finding out the index of the value to update
Double updated_val = vals.get(val_id);      // Getting the value
// System.out.println("We need to update " + updated_val); // => We need to update 10.67
updated_val = updated_val + 1;             // Incrementing the value
String replace_pattern = "(dummy:(?:\\d+\\.\\d.*?dummy:){" + (val_id) + "})\\d+\\.\\d+";
// System.out.println("New pattern: " + replace_pattern); // => New pattern: (dummy:(?:\d+\.\d.*?dummy:){1})\d+\.\d+
String result = s.replaceFirst(replace_pattern, "$1" + updated_val); // Replacing
System.out.println(result);
// => dummy:10.45someObjectdummy:11.67somethingdummy:10.78somethingdummy:10.98djd

模式是 (dummy:(?:\d+\.\d.*?dummy:){1})\d+\.\d+(其中 1 是动态的):

  • (dummy:(?:\d+\.\d.*?dummy:){1}) - 第 1 组匹配
    • dummy: - dummy: 字符串
    • (?:\d+\.\d.*?dummy:){1} - n(此处为 1)次:
      • \d+\.\d - 1+ 个数字,. 和一个数字
      • .*? - 除换行符以外的任何 0+ 个字符(如果字符串包含换行符,则在模式的开头添加 (?s))尽可能少
      • dummy: - dummy: 字符串
  • \d+\.\d+ - 1+ 位,. 又是 1+ 位。

关于java - 在半索引实例处查找并替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043858/

相关文章:

javascript - 用于匹配 "Viewing 1 to 10 of 100"等字符串的正则表达式模式

java - 将属性文件合并到现有 Runabble jar 不起作用

java - 在 DataBaseHelper 类中实现 Parcelable

java - Java/Apache Commons Compress 中的 zip64 文件的 ZipFile 构造函数速度慢

java - 需要删除 HDFS 中的part-m-0000* 文件

java - 替换字符串的字符忽略空格直到java中的字符

java - Android Java SoundPool.setRate 在 Nexus S 上不起作用

用于正则表达式查找价格和检测货币的 JavaScript 函数

javascript - 在 JavaScript 中查找文本字符串

c# - 正则表达式 : replace a string