Java: изменить значение переменной (String) в соответствии со значением регулярного выражения - PullRequest
0 голосов
/ 19 декабря 2011

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

Например:

String content = "111122223333";
String regex = "?";

Ожидаемый результат: "1111 2222 3333 ##";

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Только с одним регулярным выражением, я не думаю, что это возможно. Но вы можете:

  • сначала замените (?<=(.))(?!\1) пробелом;
  • затем используйте строку append для добавления "##".

е

Pattern p = Pattern.compile("(?<=(.))(?!\\1)");

String ret = p.matcher(input).replaceAll(" ") + " ##";

Если вы имели в виду разделение всех групп, тогда отбросьте вторую операцию.

Объяснение: (?<=...) - положительный взгляд сзади, а (?!...) - отрицательный взгляд вперед. Здесь вы говорите, что хотите найти позицию, где позади находится один символ, который захвачен, и где тот же символ должен , а не следовать. И если так, замените пробелом. Lookaheads и lookbehind являются якорями, и, как и все якоря (включая ^, $, \A и т. Д.), Они не потребляют символы, поэтому это работает.

0 голосов
/ 19 декабря 2011

ОК, так как OP переопределил проблему (т. Е. Группа из 12 цифр, которые должны быть разделены на 3 группы по 4, а затем ##, решение становится таким:

Pattern p = Pattern.compile("(?<=\\d)(?=(?:\\d{4})+$)");

String ret = p.matcher(input).replaceAll(" ") + " ##";

Регулярное выражение немного меняется:

  • (?<=\d): позади должна быть одна цифра;
  • (?=(?:\d{4})+$): после этого должна быть одна или несколько групп из 4 цифр,до конца строки ((?:...) не является группировкой без захвата - не уверен, что это действительно имеет значение для Java).

Проверка того, что ввод имеет длину 12 цифр, может быть легко выполнена с помощьюметоды, которые вообще не связаны с регулярными выражениями. И эта проверка, на самом деле, необходима: к сожалению, это регулярное выражение также превратит 12345 в 1 2345, но нет никакого способа обойти это, потому что lookbehinds не может соответствоватьрегулярные выражения произвольной длины ... За исключением языков .NET. С ними вы могли бы написать:

(?<=^(?:\d{4})+)(?=(?:\d{4})+$

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