Java регулярное выражение с заменой - PullRequest
0 голосов
/ 19 февраля 2020

Мне нужно заменить строку на переменную внутри {} с помощью регулярного выражения

Например:

"Hi, there are {online@US-server} players in the US server" to "Hi, there are 12 players in the US server"

Внутри строк переменные внутри {} могут быть больше 1

Мне нужен этот код, чтобы пользователи могли изменять сообщения. переменная внутри {} после @, как в примере 'US-сервер' введены пользователями, поэтому нет списка для проверки переменной. Переменные могут быть как можно более странными, например: '{online@test-UK}' '{online@asdtest}'

public static String getReplaced(String d) {
    String result = d.split("\\{online@")[0];

    for (int i = 1; i < d.split("\\{online@").length; i++) {
        String dd = d.split("\\{online@")[i];

        Pattern p = Pattern.compile("(.*?)}(.*)");
        Matcher m = p.matcher(dd);

        if (m.lookingAt()) {
            int count = 12;

            result += count + m.group(2);
        } else {
            result += dd;
        }
    }

    return result;
}

Ответы [ 3 ]

1 голос
/ 19 февраля 2020

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

public String replaceTag(String tag, String replacement, String template) {
   private final String decoratedTag = "{online@" + tag + "}";

   return template.replace(decoratedTag, replacement);
}

Вы можете вызывать это повторно:

private String template = getTemplateFromUser();
private String output = template.replace('US-server', usServerCount);
output = output.replace('asdtest', testValue);
return output;

... или вы можете быть более изощренным и l oop через набор пар тегов / значений, например из Map<String, String>

Обратите внимание, что String.replace() просто заменяет последовательности символов тупо, это не замена регулярного выражения, что для этой проблемы хорошо.

1 голос
/ 19 февраля 2020

Используя \\{online@(.+)\\} в качестве регулярного выражения, используйте совпадение, чтобы получить первую группу захвата. Это даст вам часть после @.

Regex означает:

  • \\{: буквенный символ '{'
  • online@: строка online@
  • .+: хотя бы один символ (любой)
  • (.+): группа захвата
  • \\}: буквенный символ '}'

Затем просто используйте String#replaceAll(String regex, String replacement) (сделайте c здесь ).

Пример:

int myIntValue = 12;
String myString = "there are {online@US-server} players";
Pattern p = Pattern.compile("\\{online@(.+)\\}") ;
Matcher m = p.matcher(myString) ;

if (m.find()) { // true if the pattern is found anywhere in your string.
  System.out.println("Variable part is : " + m.group(1)); // group 1 is the capturing group
  System.out.println(myString.replaceAll("\\{online@.+\\}", String.valueOf(myIntValue)));
}

Если вам нужно найти более одного заполнитель в одной строке:

String myString = "there are {online@US-server} players ,and {online@whatever}";
Pattern p = Pattern.compile("\\{online@(.+)\\}") ;
Matcher m = p.matcher(myString) ;

while (m.find()) { // true if the pattern is found anywhere in your string.
  System.out.println("Variable part is : " + m.group(1)); // group 1 is the capturing group
  System.out.println(myString.replace("{online@"+m.group(1)+"}", String.valueOf(myIntValue)));
}
0 голосов
/ 19 февраля 2020
([^\s]+)online@[A-Za-z\-]([^\s]+)

, кажется, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...