用整数替换所有变量

时间:2016-10-01 10:34:52

标签: java regex string parsing

我正在尝试替换所有"变量"使用标准输入的整数。

输入字符串:

  

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

3 个答案:

答案 0 :(得分:2)

使用\breplaceAll中定义变量名称两侧的单词边界,以表示您要替换完整单词而不是单词的子部分,如下所示:

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

Demo.