JavaScript использование RegEx для разбора LastName

Я видел много постов, которые-почти-то, что мне нужно, и мне удалось получить — почти-ответ, который мне нужен, Но я мог бы использовать небольшую помощь, чтобы получить последний бит. Я думаю, что я путаюсь между тем, когда использовать .матч и когда использовать .заменять. (Возможно, я видел ответ в других сообщениях, но без контекста того, как его применять, я не узнал его; это требование к дефису, которое сделало это интересным.)

У меня есть текстовое поле ввода, которое выглядит следующим образом —

<input type="text" id="PatientLastName"
                 name="PatientLastName"
               onblur="FormatLastName('PatientLastName')"
                value="@Model.PatientLastName"
            maxlength="100" required />

Функция onblur —

function FormatLastName(textBoxID) {
     var someName = document.getElementById(textBoxID).value.toUpperCase();
     someName = $.trim(someName);
     var reName = /(([A-Z])+((-?)([A-Z]*)*))/;
     var matches = someName.match(reName);
     var aName = matches[1];
     document.getElementById(textBoxID).value = aName;
}

Мне нужно иметь возможность извлекать только части имени из любого ввода — например,

9898s+m+_it????h-22324j4o5n4e0=s will give me SMITH-JONES

который пожеланный выход. (all Upper-case, the only special character allowed is one and only one hyph between letters. Такое имя, как» O’Reilly», станет»OREILLY». Отсутствие поддержки для неанглийских характеров, ни акцентов.)

И если нет дефисов, он работает хорошо, например

9898s+m+_it????h22324j4o5n4e0=s will give me SMITHJONES

Но для —

9898s+m+_it????h-22324j4o5n4e0-=s will give me SMITH-

Поэтому я предполагаю, что у меня есть либо группировка, либо кванторы не совсем правильно; может быть, мне нужно посмотреть больше матчей? Сценарий для first name работает нормально, но он основан на .заменить — я не мог найти способ получить .заменить для работы с дефисом.

Первая версия имени работает, используя .заменить, is —

function FormatFirstName(textBoxID) {
     var someName = document.getElementById(textBoxID).value.toUpperCase();
     someName = $.trim(someName);
     someName = someName.replace(/[^A-Z]/g, '');
     document.getElementById(textBoxID).value = someName;
}

Спасибо за любую помощь.

— edit— надеюсь, я не запутал вещи, включив функцию FirstName. Я поставил это, чтобы показать, где я могу добраться до того, где мне нужно быть с точки зрения избавления от специальных символов и прописных букв-но это не делает соответствия шаблону, который мне нужен. Replace выглядит так, как будто это может оставить меня с хвостовым дефисом и, похоже, не фильтрует случаи, когда есть более одного дефиса. Мне нужен Смит-Джонс, Смит-Джонс будет проблемой, как и Смит -.

2 ответа

  1. Вы должны заменить в onblurфункции. Я создал пример для вас, чтобы посмотреть на

    function getValue(){
      var value= arguments[0];
      value = value.replace(/[^a-zA-Z\-]*/g, "");
      console.log(value.toUpperCase());
    }
    <input type="text" onblur="getValue(this.value)"/>

    и в этом конкретном случае, пожалуйста, обновите свою функцию как

    function FormatFirstName(textBoxID) {
         var someName = document.getElementById(textBoxID).value.toUpperCase();
         someName = $.trim(someName);
         someName = someName.replace(/[^a-zA-Z\-]*/g, ''); 
         document.getElementById(textBoxID).value = someName.toUpperCase();
    }
    
  2. Вы пробовали что-то вроде:

    function FormatFirstName(textBoxID) {
        var someName = document.getElementById(textBoxID).value.toUpperCase();
        someName = $.trim(someName);
        someName = someName.replace(/[^A-Z\-]/g, '');
        document.getElementById(textBoxID).value = someName;
    }
    

    \-в RegExp позволяет дефисам быть сохраненным.