Заменить в шаблоне регулярных выражений группу из другого шаблона - PullRequest
1 голос
/ 31 марта 2019

У меня есть строка типа

a#?.text1

У меня есть две другие строки, такие как c#1.text2 и d#2.text3

Я хочу заменить #? в a#?.text1 с a#1.text1, если я выберу c#1.text2. Если я выберу d#2.text3, то я хочу заменить a#?.text1 на a#2.text1. Какой самый простой способ сделать это? Я придумал решение с использованием групп, но моя команда не считает, что это эффективный способ сделать это. Вот мой код Java:

Pattern strPattern = Pattern.compile("(\\w+)(#\\?)(\\.\\w+)");
Pattern replacePattern = Pattern.compile("(\\w+)(#\\d+)(\\.\\w+)");

Matcher strMatcher = strPattern.matcher("a#?.text1");
Matcher replaceMatcher1 = replacePattern.matcher("c#1.text2");
Matcher replaceMatcher2 = replacePattern.matcher("d#2.text3");

if(strMatcher.matches() && replaceMatcher1.matches()) {
  String number = replaceMatcher1.group(2);
  return strMatcher.replaceAll(strMatcher.group(1) + number + strMatcher.group(3));
} else if(strMatcher.matches() && replaceMatcher2.matches()) {
  String number = replaceMatcher2.group(2);
  return strMatcher.replaceAll(strMatcher.group(1) + number + strMatcher.group(3));
}

Я получил ответ, что группы неэффективны, и мне нужно найти более простой способ сделать это.

Есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 31 марта 2019

Похоже, вы просто хотите извлечь число после # из ваших двух строк, которые c#1.text2 и d#2.text3, и заменить ? сразу после # в a#?.text1 строке.

Код, который вы написали, кажется немного похожим на то, где вы создали два Pattern, а затем вы выполняете замену, используя Matcher объекты, захватывая три группы, где это можно легко сделать с помощью некоторых более коротких кодов. без необходимости создавать два Pattern объекта.

Просто извлеките число, которое нужно заменить, и затем замените его в строке напрямую, используя метод replaceFirst для самого объекта String, используя эти коды,

Pattern replacePattern = Pattern.compile("\\w+#(\\d+)\\.\\w+");
Matcher m = replacePattern.matcher("c#1.text2"); // same way for d#2.text3
if (m.matches()) {
    String digit = m.group(1); // the digit you wanted to extract
    String retVal = "a#?.text1".replaceFirst("(?<=#)\\?", digit); // replace ? preceded by # with the digit using replaceFirst
    System.out.println(retVal); // prints a#1.text1
    return retVal;
} else {
    System.out.println("String doesn't match the pattern");
}

В целом ваши коды можно записать так:

Pattern replacePattern = Pattern.compile("\\w+#(\\d+)\\.\\w+");
Matcher m = replacePattern.matcher("c#1.text2"); // same way for d#2.text3
if (m.matches()) {
    return "a#?.text1".replaceFirst("(?<=#)\\?", m.group(1)); // returns a#1.text1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...