2016-10-01 70 views
3

我想用整数替换所有使用标准输入的“变量”。用整数替换所有变量

输入字符串:

“PQ + PQ + PQR + 4”

说,我输入1为pq和3 pqr。 我想什么是

“1 + 1 + 3 + 4”

我怎么能得到这个? 目前,我的代码也取代pqr1r,这是不合法的。

// 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; 
} 

回答

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

Demo.

1

你可以你想顶替基于它们的长度模式简单排序,然后应用它们,这将解决您的问题。与实施祝你好运。

2

使用\b,以便确定你的变量名两边的单词边界在replaceAll,表明要替换一个完整的字不是字的子部分,如下:

line = line.replaceAll("\\b" + targetStr + "\\b", newStr);