ReplaceAll метод регулярного выражения

Мой образец ввода - "0X10001,0X10002,0X610001,0X610002"

System.out.println(st.replaceAll(regex, "0"));

Мой вывод должен быть "010001,010002,610001,610002"
0X следует заменить на
. 0 -> если длина 7
"" -> если длина 8

какое регулярное выражение мне нужно использовать?
([0X]){1,2} не получает от этого желаемого результата.

Опубликуйте регулярное выражение, которое у вас уже есть и которое вы хотите улучшить.

chb 07.01.2019 06:59

([0X]) {1,2} это не дает желаемого результата.

teja vethsa 07.01.2019 07:10

сделайте две отдельные замены: первая замените 0X(\d{5}) на 0$1, вторая замените 0X(\d{6}) на $1

Adrian Shum 07.01.2019 07:20

@AdrianShum Вы захотите изменить порядок и / или проверить границы слов.

shmosel 07.01.2019 07:24

@Adrian Shum, спасибо, когда я использую две замены вроде этого System.out.println (st.replaceAll ("0X (\\ d {5})", "0 $ 1"). ReplaceAll ("0X (\ d {6) }) "," $ 1 ")); он показывает ошибку (говорит, что я должен использовать \ b, \ n ...…) в eclipse

teja vethsa 07.01.2019 07:37

@shmoesel: да, я намеренно не давал полное регулярное выражение, а просто давал основную идею (и ожидал, что OP напишет свое)

Adrian Shum 07.01.2019 07:38

Вам нужно избегать обратной косой черты.

shmosel 07.01.2019 19:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
7
70
2

Ответы 2

Делай это так:

String st = "0X10001,0X10002,0X610001,0X610002";
System.out.println(st.replaceAll("0X(?=\\d{6})|(0)X(?=\\d{5})", "$1"));

Вывод

010001,010002,610001,610002

Объяснение

Когда механизм регулярных выражений сканирует, шаблон | всегда будет пробовать левую сторону перед правой, поэтому по мере продвижения он сначала будет пробовать 0X(?=\\d{6}), который соответствует 0X, за которым следуют 6 цифр (с использованием положительного упреждения нулевой ширины) . Если это совпадает, ничего не записывается, поэтому $1 пуст, а 0X заменяется пустой строкой.

Если это не совпадает, он пытается (0)X(?=\\d{5}), то есть сопоставить 0X, за которым следуют 5 цифр. Если это совпадает, 0 попадает в группу 1, поэтому $1 - это 0, а 0X заменяется на 0.

Если ни один из них не соответствует, механизм регулярных выражений попытается еще раз в следующей позиции во входной строке.

сложно, но интересно :)

Adrian Shum 07.01.2019 07:39

спасибо за объяснение и ответ @Andreas

teja vethsa 07.01.2019 07:54

replaceAll("0X(?=\\d{6})|(0)X(?=\\d{5})", "$1") отлично работает для данных вопросов

Другие вопросы по теме