2017-01-13 3 views
0

J'ai vu beaucoup de messages qui sont-presque-ce dont j'ai besoin et j'ai réussi à obtenir presque la réponse dont j'ai besoin, mais je pourrais utiliser un peu d'aide pour obtenir le dernier bit . Je pense que je deviens confus entre quand utiliser .match et quand utiliser .replace. (J'ai peut-être vu la réponse dans d'autres articles, mais sans le contexte de l'application, je ne l'ai pas reconnu, c'est l'exigence du trait d'union qui l'a rendu intéressant.)JavaScript en utilisant RegEx pour analyser le nom

J'ai une zone de saisie qui ressemble à ceci -

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

La fonction onblur est -

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; 
} 

Je dois être en mesure de tirer juste les parties du nom de toute entrée - par exemple,

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

qui est la sortie désirée. (tous les majuscules, le seul caractère spécial autorisé est un et un seul trait d'union entre les lettres.Un nom comme "O'Reilly" deviendrait "OREILLY ".Non support pour les caractères non-anglais, ni les accents.)

et s'il n'y a pas de traits d'union, il fonctionne bien ainsi, par exemple

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

Mais pour -

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

Je devine que j'ai soit le groupe ou quantificateurs pas tout à fait raison; peut-être que je dois regarder plus de matches? Le script du prénom fonctionne bien, mais il est basé sur .replace - Je n'ai pas trouvé de moyen d'obtenir .replace pour fonctionner avec le trait d'union.

La première version du nom des œuvres, en utilisant .replace, est -

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

Merci pour toute aide.

--edit-- J'espère que je n'ai pas confondu les choses en incluant la fonction FirstName. Je l'ai mis là pour montrer où je peux aller là où je dois être en termes de se débarrasser des caractères spéciaux et des majuscules - mais cela ne correspond pas au modèle dont j'ai besoin. Remplacer ressemble à ce qu'il pourrait me laisser avec un trait d'union et ne semble pas filtrer les cas où il y a plus d'un trait d'union. J'ai besoin de SMITH-JONES, SMITH - JONES serait un problème, tout comme SMITH-.

+0

Jetez un coup d'œil à http: //www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – Toto

+0

@Toto - oui, c'est une bonne liste de contrôle, mais j'enregistre les noms des patients et ils sont plus heureux avec les noms simplifiés. Certains de leurs systèmes sont vieux et casseraient si vous essayiez d'entrer d'autres types de noms. Ainsi, même si les développeurs savent que les noms peuvent avoir un éventail incroyable de variantes, ces utilisateurs finaux ont des besoins simples. C'est un cas de donner au client ce qu'ils demandent. –

Répondre

0

Vous devez remplacer la fonction onblur. J'ai créé un exemple pour vous de regarder

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

et dans ce cas particulier, s'il vous plaît mettre à jour votre fonction

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 - merci de fournir un exemple de comment "ceci". devrait être utilisé, je n'étais pas clair sur ce point. Quand je teste ce code en utilisant "smith - jones--" il renvoie "SMITH - JONES--" quand je cherche "SMITH - JONES" Un simple remplacement ne semble pas pouvoir filtrer plusieurs traits d 'union ou empêcher un trait d'union traînant. Pas de problème lors de l'analyse d'un prénom, mais ne fonctionne pas pour le nom de famille. –

0

Avez-vous essayé quelque chose comme:

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

le \- dans RegExp permet de conserver les traits d'union.

+0

Oui, j'ai vu cela comme une option, mais cela n'empêche pas quelque chose comme "SMITH-" où le trait d'union est le dernier caractère et il ne semble pas que cela empêcherait plusieurs tirets comme "SMITH-JONES-RENTY" . Le remplacement semblait une bonne approche pour se débarrasser des personnages que je ne voulais pas, mais je n'ai pas réussi à trouver comment faire correspondre le motif au nom. –

+0

Vous pouvez ajouter '- $' dans le RegExp pour éviter de mettre fin aux tirets. Mais je ne vois pas de solution facile pour les "doubles tirets". Excepté quelque chose de laid comme 'someName.replace (/ [^ AZ \ -] | - $/g, '') .replace (/ -/g, '-');' –

+0

Pouvez-vous également m'expliquer ce que vous voulez? ne pas obtenir lorsque l'entrée est "SMITH-JONES-RENTY"? –