Java replaceAll регулярное выражение с использованием найденных экземпляров - PullRequest
1 голос
/ 28 октября 2010

Я искал способ заменить экземпляры [number][char] или [char][number], как это происходит в математических выражениях (например, 4x + 20y) с [number]*[char] или [char]*[number],

У меня есть две проблемы с этим

  • Как повторно использовать найденное число и символ => `replaceAll (" [0-9999] [a-z] "," [1] * [2] ")`?
  • Какой лучший способ представить число, потому что я могу быть больше, чем просто цифра

Спасибо за любую помощь

Ответы [ 3 ]

3 голосов
/ 28 октября 2010
package so4038148;

import static org.junit.Assert.*;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

public class MathExpr {

  private static final Pattern PAT_BEAUTIFY = Pattern.compile("(\\d+)(\\w)");

  /** The shortest code, but not the most efficient one. */
  public static String beautify1(String s) {
    return s.replaceAll("(\\d+)(\\w)", "$1*$2");
  }

  /** Still short, and doesn't need to compile the regex each time. */
  public static String beautify2(String s) {
    return PAT_BEAUTIFY.matcher(s).replaceAll("$1*$2");
  }

  /**
   * Use this when you have to do more complicated things with the captured
   * groups.
   */
  public static String beautify3(String s) {
    Matcher m = PAT_BEAUTIFY.matcher(s);
    if (!m.find()) {
      return s;
    }
    StringBuffer sb = new StringBuffer();
    do {
      m.appendReplacement(sb, m.group(1) + "*" + m.group(2));
    } while (m.find());
    m.appendTail(sb);
    return sb.toString();
  }

  @Test
  public void test() {
    assertEquals("20*a+4*y", beautify1("20a+4y"));
    assertSame("hello", beautify1("hello"));

    assertEquals("20*a+4*y", beautify2("20a+4y"));
    assertSame("hello", beautify2("hello"));

    assertEquals("20*a+4*y", beautify3("20a+4y"));
    assertSame("hello", beautify3("hello"));
  }
}
1 голос
/ 28 октября 2010

РЕДАКТИРОВАТЬ: Извините, неправильно истолковал это как вопрос JavaScript.Общие сведения о регулярных выражениях, приведенные ниже, по-прежнему применимы, но имя синтаксиса / метода будет отличаться в java.

В регулярном выражении \ d - сокращение для [0-9] и + означает «соответствовать одному или нескольким экземплярам предыдущего символа».Таким образом, \ d + означает «сопоставить любое количество последовательных цифр».

Вы можете группировать совпадения в строке, заключив в скобки то, что вы хотите, и каждой группе присваивается номер, начиная с1 и увеличение для каждой группы.Вы можете заменить соответствующую группу, вставив $ 1 (или $ 2 и т. Д.) В строку замены.

Наконец, replaceAll не является функцией.Вы используете replace , но добавляете g в конце регулярного выражения, чтобы обозначить "глобальную замену".

Итак, вы ищете что-то вроде этого:

txt = txt.replace(/(\d+)([a-z])/g, "$1*$2")
0 голосов
/ 28 октября 2010

Помните, что вам может понадобиться экранировать символы, относящиеся к регулярному выражению, в строке замены при использовании replaceAll (второй аргумент).

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