Java Regex: заменить все числовые значения одним числом - PullRequest
2 голосов
/ 12 октября 2011

У меня есть простая строка текста, которая может включать цифры, такие как «12.3» или «1983» или «5/8».Всякий раз, когда появляется какое-либо число, мне просто нужно заменить его на фиксированный символ, скажем цифру "8".

Я возился с Regex в Java с такими вещами:

но безрезультатно.

Есть идеи, какой должен быть правильный шаблон?

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Попробуйте это выражение: (?>-?\d+(?:[\./]\d+)?), имейте в виду, что в строках Java вам нужно избегать обратной косой черты, то есть вы получите "(?>-?\\d+(?:[\\./]\\d+)?)"

Вот разбивка выражения:

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

  2. -? потенциальный минус для отрицательных чисел

  3. \d+ любая последовательностьцифр (хотя бы одна)

  4. (?:[\./]\d+)? необязательная группа без захвата, состоящая из одной точки (обратите внимание, что здесь вам не нужно избегать ее, это просто для согласованности) или косая черта, за которой следует хотя бы еще одна цифра.

Обновление

Если вы не хотите заменять «цифры», такие как .1234, 1234. /1 или 5/ (цифра отсутствует ни слева, ни справа), попробуйте следующее выражение: (?>(?<![\d\./])-?\d+(?:(?:[\./]\d+)|(?![\d\./])))

Снова разбивка:

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

  2. (?<![\d\./]) совпадение не должно следовать непосредственно за цифрой, точкой или косой чертой - обратите внимание, что необходимо ограничение не следовать за цифройсовпадать в начале числа, в противном случае вы будете соответствовать 234 в .1234

  3. -? потенциальный минус для отрицательных чисел

  4. \\d+ любая последовательность цифр (хотя бы одна)

  5. (?:(?:[\./]\d+)|(?![\d\./])) совпадение должно иметь точку или косую черту, за которыми следует хотя бы одна цифра, или не должно бытьсопровождаемый цифрой, точкой или косой чертой, это будет соответствовать 1.0, но не 1. - обратите внимание, что для предотвращения совпадения 123 в 1234.

0 голосов
/ 12 октября 2011

Вы забыли сбежать. персонаж. Кроме того, ваш шаблон выглядит хорошо для меня.

String line = str.replaceAll("[0-9]+/*\\.*[0-9]*", "8");

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

0 голосов
/ 12 октября 2011

Если вам нужно заменить целое число всего одним символом, используйте этот код:

import java.io.*;

class Moo
{
  public static void main(String[] args)
  {
    String vals[] = { "1.2", "-3.14", "100500" };
    for (String s : vals)
    System.out.println(s.replaceAll("(-)?\\d+(\\.\\d*)?", "x"));
  }
}

Но если вам нужно заменить каждую цифру, вы должны использовать другое регулярное выражение, как этот: "\\d".

См. Демоверсию .

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