2017-01-13 11 views
0

Я видел много сообщений, которые являются самыми-то, что мне нужно, и мне удалось получить -большой ответ, который мне нужен, но я мог бы немного помочь получить финальный бит , Я думаю, что меня путают между тем, когда использовать .match и когда использовать .replace. (Возможно, я видел ответ в других сообщениях, но без контекста того, как его применять, я не узнал его, это требование для дефиса сделало это интересным.)JavaScript Использование RegEx для Parse 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 

, который является желаемым выходом. (все uppper-case, единственный разрешенный символ - это один и только один дефис между буквами. Название типа «O'Reilly» станет «OREILLY». Нет поддержки для неанглийских символов или акцентов.)

И если там нет дефиса, он работает нормально, а также, например

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

Но -

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

так я предполагаю, что у меня есть либо группировки или кванторы не совсем правильные; может, мне нужно посмотреть больше матчей? Скрипт для имени работает отлично, но он основан на .replace - я не мог найти способ получить .replace для работы с дефисом.

Первое название версия работы, используя .Привернуть, это -

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. Я помещал это, чтобы показать, где я могу добраться туда, где мне нужно быть в плане избавления от специальных символов и верхних букв - но это не соответствует подходящему шаблону. Заменить выглядит так, как будто это может оставить меня с завершающим дефисом и, похоже, не фильтрует случаи, когда имеется более одного дефиса. Мне нужен СМИТ-ДЖОНС, СМИТ - ДЖОНС будет проблемой, как и СМИТ.

+0

Посмотрите на http: //www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – Toto

+0

@Toto - да, это хороший контрольный список, но я записываю имена пациентов, и они более счастливы с упрощенными именами. Некоторые из их систем старые и будут ломаться, если вы попытаетесь ввести другие типы имен. Поэтому, хотя разработчики знают, что имена могут иметь удивительный набор вариаций, эти конечные пользователи имеют простые потребности. Это случай предоставления клиенту того, что они просят. –

ответ

0

Вы должны заменить в функции 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(); 
} 
+0

@Faroog - спасибо за предоставленный пример того, как это происходит. следует использовать, я был неясен в этом. Когда я тестирую этот код с помощью «smith-jones--», он возвращает «SMITH-JONES--», когда я ищу «SMITH-JONES». Простая замена не похожа на то, что она может отфильтровывать несколько дефис или предотвратите конечный дефис. Не проблема при разборе имени, но не работает для имени. –

0

Пробовали ли вы что-то вроде:

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 позволяет сохранять дефисы.

+0

Да, я видел это как вариант, но это не мешает чему-то вроде «SMITH-», где дефис является последним символом, и это не похоже на то, что это предотвратит появление нескольких дефисов типа «SMITH-JONES-RENTY», , замена казалась хорошим подходом к избавлению от персонажей, которых я не хотел, но не смог понять, как сопоставить шаблон для имени. –

+0

Вы можете добавить '- $' в RegExp, чтобы избежать окончания дефисов. Но я не вижу простого решения для «двойных дефис». Кроме того, что-то уродливое, как 'someName.replace (/ [^ AZ \ -] | - $/g, '') .replace (/ -/g, '-');' –

+0

Можете ли вы также объяснить мне, что вы делаете Чтобы получить, когда вводят «SMITH-JONES-RENTY»? –

 Смежные вопросы

  • Нет связанных вопросов^_^