Java-使用正则表达式进行单数/复数检查

时间:2019-06-15 14:46:52

标签: java regex replace singular plural

我想根据数字将String中的variabel替换为单数/复数词。

我尝试过使用正则表达式,但是我不知道如何使用正则表达式和替换项的组合。

//INPUTS: count = 2; variable = "Some text with 2 %SINGMULTI:number:numbers%!"
public static String singmultiVAR(int count, String input) {
    if (!input.contains("SINGMULTI")) {
        return null;
    }

    Matcher m = Pattern.compile("\\%(.*?)\\%", Pattern.CASE_INSENSITIVE).matcher(input);
    if (!m.find()) {
        throw new IllegalArgumentException("Invalid input!");
    }

    String varia = m.group(1);

    String[] varsplitted = varia.split(":");

    return count == 1 ? varsplitted[1] : varsplitted[2];
}
//OUTPUTS: The input but then with the SINGMULTI variable replaced.

现在它仅输出变量,而不输出整个输入。我该如何将其添加到代码中?

2 个答案:

答案 0 :(得分:1)

您可以使用Matche的{​​{3}}方法替换匹配的字符串。

实际上,您不必拆分字符串,只需在正则表达式中匹配:

// You don't need the "if (!input.contains("SINGMULTI"))" check either!
Matcher m = Pattern.compile("\\%SINGMULTI:(.*?):(.*?)\\%").matcher(input);

如果计数为1,则替换为组1,否则替换为组2:

// after checking m.find()
return m.replaceAll(count == 1 ? "$1" : "$2");

答案 1 :(得分:1)

使用正则表达式替换循环。

仅供参考:您还需要替换输入字符串中的数字,所以我使用%COUNT%作为标记。

还请注意,%在正则表达式中不是特殊字符,因此无需对其进行转义。

可以轻松扩展此逻辑以支持更多替换标记。

public static String singmultiVAR(int count, String input) {
    StringBuilder buf = new StringBuilder(); // Use StringBuffer in Java <= 8
    Matcher m = Pattern.compile("%(?:(COUNT)|SINGMULTI:([^:%]+):([^:%]+))%").matcher(input);
    while (m.find()) {
        if (m.start(1) != -1) { // found %COUNT%
            m.appendReplacement(buf, Integer.toString(count));
        } else { // found %SINGMULTI:x:y%
            m.appendReplacement(buf, (count == 1 ? m.group(2) : m.group(3)));
        }
    }
    return m.appendTail(buf).toString();
}

测试

for (int count = 0; count < 4; count++)
    System.out.println(singmultiVAR(count, "Some text with %COUNT% %SINGMULTI:number:numbers%!"));

输出

Some text with 0 numbers!
Some text with 1 number!
Some text with 2 numbers!
Some text with 3 numbers!