我的文字和正则表达式看起来像这样
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个项目。所以我们需要相应地更换。
答案 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