Как мне написать регулярное выражение, чтобы найти следующий шаблон? - PullRequest
1 голос
/ 20 октября 2010

Я пытаюсь написать регулярное выражение для выполнения операции поиска и замены.Предположим, синтаксис Java регулярных выражений.Ниже приведены примеры того, что я пытаюсь найти:

  • 12341 + 1
  • 12241 + 1R1
  • 100001 + 1R2

Итак, я ищу строку, начинающуюся с одной или нескольких цифр, за которыми следует подстрока «1 + 1», за которой следуют 0 или более символов.У меня есть следующее регулярное выражение:

^(\d+)(1\\+1).*

Это регулярное выражение успешно найдет приведенные выше примеры, однако моя цель состоит в том, чтобы заменить строки всем, что было до "1+1".Таким образом, 12341 + 1 станет 1234, а 12241 + 1R1 станет 1224. Если я использую первое сгруппированное выражение $1 для замены шаблона, я получаю неверный результат следующим образом:

  • 12341+1 становится 12341
  • 12241 + 1R1 становится 12241
  • 100001 + 1R2 становится 100001

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 20 октября 2010

Ваше существующее регулярное выражение работает нормально, просто вы пропускаете \ до \d

String str = "100001+1R2";
str = str.replaceAll("^(\\d+)(1\\+1).*","$1");

Рабочая ссылка

0 голосов
/ 20 октября 2010

ИМХО, регулярное выражение верно.

Возможно, вы неправильно написали в коде.Если вы хотите закодировать регулярное выражение ^(\d+)(1\+1).* в строке, вы должны написать что-то вроде String regex = "^(\\d+)(1\\+1).*".

Ваш вывод является результатом замены ^(\d+)(1+1).*, поскольку вы пропускаете некоторую обратную косую черту в строке (например, "^(\\d+)(1\+1).*").

0 голосов
/ 20 октября 2010

Лично я бы вообще не использовал Regex (это было бы похоже на использование молотка на кнопке), я просто создал бы подстроку из (псевдокода)

stringName.substring(0, stringName.indexOf("1+1")) 

Но похоже, что другие авторы уже упоминали о не жадном операторе.

В большинстве синтаксисов Regex вы можете добавить '?' после '+' или '*', чтобы указать, что вы хотите, чтобы он совпадал как можно меньше, прежде чем двигаться дальше в паттерне. (Таким образом: ^(\d+?)(1+1) соответствует любому количеству цифр, пока не найдет «1 + 1», а затем, НЕ ВКЛЮЧАЯ «1 + 1», он продолжит совпадение, тогда как ваш оригинал увидит 1 и также совпадет с ним).

0 голосов
/ 20 октября 2010

Ваше регулярное выражение выглядит хорошо для меня - у меня нет доступа к Java, но в JavaScript код ..

"12341+1".replace(/(\d+)(1\+1)/g, "$1");

Возвращает 1234, как и следовало ожидать. Это работает для строки со многими «кодами», например,

"12341+1 54321+1".replace(/(\d+)(1\+1)/g, "$1"); 

дает 1234 5432.

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