Java - проверка единственного / множественного числа с регулярным выражением - PullRequest
0 голосов
/ 15 июня 2019

Я хочу заменить переменную в строке на единственное / множественное число, основанное на числе.

Я пытался использовать регулярное выражение, но не знаю, как использовать комбинацию регулярного выражения.и заменяет.

//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 ]

1 голос
/ 15 июня 2019

Используйте цикл замены регулярных выражений.

К вашему сведению: Вам также необходимо заменить число во входной строке, поэтому я использую %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!
1 голос
/ 15 июня 2019

Вы можете использовать метод Matche replaceAll для замены совпадающей строки.

На самом деле вам не нужно разбивать строку, вы можете просто сопоставить : в своем регулярном выражении:

// 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");
...