Это не то, что должно быть сделано с помощью регулярных выражений.Тем не менее, вы можете сделать что-то подобное, но это не стоит затраченных усилий: регулярное выражение сложное, а возможности ограничены.
Вот иллюстративный пример замены цифры [0-9]
с таким количеством нулей.
// generate the regex and the replacement strings
String seq = "123456789";
String regex = seq.replaceAll(".", "(?=[$0-9].*(0)\\$)?") + "\\d";
String repl = seq.replaceAll(".", "\\$$0");
// let's see what they look like!!!
System.out.println(repl); // prints "$1$2$3$4$5$6$7$8$9"
System.out.println(regex); // prints oh my god just look at the next section!
// let's see if they work...
String input = "3 2 0 4 x 11 9";
System.out.println(
(input + "0").replaceAll(regex, repl)
); // prints "000 00 0000 x 00 000000000"
// it works!!!
Регулярное выражение (, как видно на ideone.com ) (слегка отформатировано для удобства чтения):
(?=[1-9].*(0)$)?
(?=[2-9].*(0)$)?
(?=[3-9].*(0)$)?
(?=[4-9].*(0)$)?
(?=[5-9].*(0)$)?
(?=[6-9].*(0)$)?
(?=[7-9].*(0)$)?
(?=[8-9].*(0)$)?
(?=[9-9].*(0)$)?
\d
Но как это работает ??
Регулярное выражение опирается на позитивных взглядов .Он соответствует \d
, но перед тем, как сделать это, он пытается определить, является ли он [1-9]
.Если это так, \1
проходит до конца ввода, где добавлен 0
, чтобы захватить этот 0
.Затем второе утверждение проверяет, является ли оно [2-9]
, и если да, то \2
проходит до конца ввода, чтобы захватить 0
и т. Д.
Метод работает, но выходит за рамкимилое упражнение с регулярными выражениями, оно, вероятно, не имеет практической практичности.
Обратите внимание, что 11
заменено на 00
.То есть каждый 1
заменяется на 1 ноль.Вероятно, можно узнать число 11 и поставить вместо него 11 нулей, но это только сделает регулярное выражение более запутанным.