我正在尝试替换所有"变量"使用标准输入的整数。
输入字符串:
" PQ + PQ + PQR + 4"
说,我为pq
输入1,为pqr
输入3。
我想得到的是
" 1 + 1 + 3 + 4"
我怎么能得到这个?
目前,我的代码也将pqr
替换为1r
,这不是有效的。
// replaces all variables to integer or double
String evalVariables(String line) {
Pattern p = Pattern.compile("(?i)(?:^|\\s+)([a-z]+)");
Matcher m = p.matcher(line);
while (m.find()) {
String targetStr = m.group();
System.out.println("targetStr: " + targetStr );
System.out.println("Enter a integer or a double value for the variable ");
System.out.print("[" + targetStr + "]: ");
Scanner sc = new Scanner(System.in);
String newStr = sc.next();
line = line.replaceAll(targetStr, newStr);
System.out.println("After replacement: "+ line);
m = p.matcher(line);
}
return line;
}
答案 0 :(得分:2)
使用\b
在replaceAll
中定义变量名称两侧的单词边界,以表示您要替换完整单词而不是单词的子部分,如下所示:
line = line.replaceAll("\\b" + targetStr + "\\b", newStr);
答案 1 :(得分:1)
您可以根据自己的长度简单地对要替换的模式进行排序,然后应用它们,这将解决您的问题。祝好运实施。
答案 2 :(得分:1)
不要说变量名称之前需要^
或\\s
,而是要求[a-z]+
两端都有单词边界,即\\b
:
Pattern p = Pattern.compile("(?i)(\\b[a-z]+\\b)");
...
line = line.replaceAll("\\b"+targetStr+"\\b", newStr);
此外,您需要在循环外移动Scanner
声明:
Pattern p = Pattern.compile("(?i)(\\b[a-z]+\\b)"); // <<=== Use \b
Matcher m = p.matcher(line);
Scanner sc = new Scanner(System.in); // <<== Scanner declared here
while (m.find()) {
String targetStr = m.group();
System.out.println("targetStr: " + targetStr );
System.out.println("Enter a integer or a double value for the variable ");
System.out.print("[" + targetStr + "]: ");
String newStr = sc.next();
line = line.replaceAll("\\b"+targetStr+"\\b", newStr); // <<=== Use \b
System.out.println("After replacement: "+ line);
m = p.matcher(line);
}