2016-10-01 60 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);