2016-10-01 8 views
3

標準入力を使用してすべての「変数」を整数に置き換えようとしています。すべての変数を整数に置き換えます

入力文字列:

"PQ + PQ + PQR + 4"

言う、Iはpqpqr及び3に1を入力します。私が取得したい何 は、私はこれを得ることができる方法

"+ 4 + 1 + 3"

のですか? 現在、私のコードは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); 
関連する問題