2016-10-01 2 views
3

표준 입력을 사용하여 모든 "변수"를 정수로 바꾸려고합니다.모든 변수를 정수로 바꿉니다

입력 문자열 :

"PQ + PQ + PQR + 4"

말은, 내가 pqr에 대한 pq 3 1 입력합니다. 내가 싶어 무엇 는

는 "1 + 1 + 4 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

는, 즉 \\b, [a-z]+가 양쪽에 단어 경계를해야 :

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

길이를 기준으로 바꾸려는 패턴을 간단하게 정렬 한 다음 적용하면 문제가 해결됩니다. 구현과 행운을 빌어 요. 대신 변수 이름 앞에 ^ 또는 \\s을있을 필요가 있다고 말하는

2

사용 \b 다음으로, 당신은 완전한 단어가 아닌 단어의 하위 부품을 교체 할 것을 표시하기 위해 귀하의 replaceAll에 변수 이름의 각 측면에서 단어의 경계를 정의하기 :

line = line.replaceAll("\\b" + targetStr + "\\b", newStr); 
관련 문제