Regex добавляет пробел в заданные позиции

Я хочу отформатировать AMEX и карту ViSA, используя один и тот же обработчик (JAVA-Android)

Для Visa я хочу выглядеть как "1234 1234 1234 1234"

И я использую:

String initial = s.toString();
// remove all non-digits characters
String processed = initial.replaceAll("\\D", "");
// insert a space after all groups of 4 digits that are followed by another digit
processed = processed.replaceFirst("(\\d{4})(?=\\d)", "$1 ");
// to avoid stackoverflow errors, check that the processed is different from what's already
//  there before setting
if (!initial.equals(processed)) {
   // set the value
   s.replace(0, initial.length(), processed);
}

У меня вопрос:

Учитывая, что у меня есть массив позиций, которые нужно заменить на "" (пример [4,9,14]), как я могу отформатировать его с помощью REGEX или любого другого метода, чтобы разрешить такие вещи, как удаление, вставка.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
242
1

Ответы 1

Вы можете просто использовать цикл for для вставки символа с 4-значным интервалом.

Сбалансируйте интервал, сохраните переменную gap и увеличивайте ее на каждой итерации, чтобы сохранить сбалансированное положение для пространства, учитывая предыдущие добавленные пробелы, поэтому используйте

String initial = s.toString();
// remove all non-digits characters
    String processed = initial.replaceAll("\\D", "");
    StringBuilder sb = new StringBuilder(processed);
    System.out.println(sb);
    int gap = 0;
    for (int i = 4; i< sb.length()-1;i+=4){
        sb.insert(i + gap,' ');
        gap++;
    }

Демо Ссылка

Для обработки обоих случаев вы можете использовать эту демонстрацию

Но если, например, у меня есть gap = [4, 11] input: 345678901234564, как я могу вывести: 3456 789012 34564

johnnyshrewd 02.06.2018 19:55

то с этим нужно обращаться по-другому, потому что в местах разрыва нет симметрии, это должно быть сделано с жестко закодированным значением, хотя теперь вы задаете другой вопрос

Pavneet_Singh 02.06.2018 19:59

Основная идея заключается в том, что у показа карт Visa есть симметричные пространства, а у AMEX - нет. Моя борьба была за AXEM в указанном выше формате (асимметричный). Можно ли это сделать с помощью REGEX?

johnnyshrewd 02.06.2018 20:01

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

Pavneet_Singh 02.06.2018 20:05

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