Регулярное выражение в javascript в очень специфическом формате

У меня есть ввод, который должен форматировать то, что печатает пользователь (на самом деле это информация с его банковского счета). Но числа должны быть отформатированы определенным образом:

  • первые 5 цифр должны быть числами.
  • если пользователь вводит более 5 цифр, перед последней цифрой должен стоять "-"
  • после 5-й цифры пользователь может ввести «x» или «X»
  • номер может состоять минимум из 5 цифр и максимум из 15

Примеры:

  • 12345
  • 12345-1
  • 123456-1
  • 1234567-1
  • 12345-х
  • 123456789-х
  • 123456789-Х
  • 12345678901234-5

На самом деле я использую нормализатор, который заменяет строку.

Это то, что я использую, но я не могу правильно отформатировать его.

export const normalizeBankAccount = value => {
    if (!value) {
      return value
    }

    if (value.length <= 16 && (!value.match(/[^\d|X]/g) || !value.match(/[^\d|-]/g) || !value.match(/[^\d|x]/g))) {
      if (value.length <= 5){
        return value.replace(/[^\d]/g, '')
      } else if (value.length >= 6) {
        const len = value.length;
        const aux=value;
        const initial = value.substring(0,value.length-1).replace('-', '');
        console.info("len: " +len, "\naux: " +aux,"\ninitial: "+ initial)
        return value.replace(new RegExp("\\d{"+ len +"}") , initial+ '-').replace(/[X]/g, '-X').replace(/[x]/g, '-x')
      }
    }
}

Когда я использую этот метод, строка форматируется следующим образом:

  • 12345-6789123
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете найти заданную длину, за которой следует один символ и добавить знак минус.

const
    normalize = string => string.replace(/^\d{5,14}(?=[0-9x]$)/i, '$&-');

console.info(['12345', '123451', '1234561', '12345671', '12345x', '123456789x', '123456789X', '123456789012345'].map(normalize));

Пример с вводом.

function update(element) {
    element.value = element.value
        .replace(/[^0-9x]/gi, '')
        .replace(/x(?=.)/gi, '')
        .replace(/^\d{5,14}(?=[0-9x]$)/i, '$&-');
}
<input type = "text" onkeyup = "update(this)" id = "x">

На самом деле это не работает, потому что числа должны быть отформатированы, поскольку пользователь продолжает печатать.

Ramon 13.04.2019 17:02

вам нужно очистить строку от всех минусов и применить нормализацию.

Nina Scholz 13.04.2019 17:05

Почти сработало, я удалил знак минус, как вы сказали, вот так: `string.replace('-', '').replace(/^\d{5,14}(?=[0-9x]$)/i , '$&-') ` Но я не могу ввести x или X

Ramon 13.04.2019 17:24

у вас есть какая-то другая фильтрация?

Nina Scholz 13.04.2019 17:31

Нет, это просто

Ramon 13.04.2019 17:34

replace(/-/g, '') => Я не знал, что это правильный способ сделать это, теперь он работает =), большое спасибо

Ramon 13.04.2019 17:45

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

Nina Scholz 13.04.2019 17:48

Можешь помочь еще с одним делом? Я хотел бы не позволять пользователю вводить что-либо, кроме 0-9, x или X, потому что таким образом пользователь может ввести любой символ

Ramon 13.04.2019 17:53

вы можете удалить ненужные символы. возможно, вам нужен еще один чек для более коротких предметов с 'x'.

Nina Scholz 13.04.2019 18:09

Этот способ работает, и более короткие элементы уже не принимают «х», потому что я добавил условие

Ramon 13.04.2019 18:29

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

Получить объекты, где имя в нижнем регистре/без пробела равно параметру в нижнем регистре/без пробела в фильтре Django
Регулярное выражение для соответствия только той части, которая не имеет следующих нескольких пробелов
С preg_match можно иметь один и тот же шаблон и разные замены?
Регулярное выражение для соответствия субдомену домена
Регулярное выражение для проверки ввода C 200 50
Как получить первое предложение перед определенной строкой с помощью Regex
SQL Server — как проверить число с помощью регулярного выражения?
Регулярные выражения: использование отрицательного взгляда вперед для неподдерживаемого отрицательного взгляда назад и захват символов взгляда позади при разделении
Выражение Java Reguar: как заменить двойную или более косых черт одной косой чертой, игнорируя http:// или https://
С# Regex для анализа json-подобного верхнего объекта