在半索引实例中查找并替换

时间:2017-07-11 20:24:02

标签: 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个项目。所以我们需要相应地更换。

2 个答案:

答案 0 :(得分:1)

由于你需要知道字符串中有多少匹配,你需要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位数字。

答案 1 :(得分:0)

如果您尝试更换里面的花车,可以使用以下内容:

String regex =  "dummy:[+-]?([0-9]*[.])?[0-9]+"

你可以在这里试试:

http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDwsSBlJlY2lwZRj6kok8DA/index.html