J'essaie de comprendre une expression régulière dans JS qui correspond entre deux caractères, mais il peut y avoir deux variantes différentes, il doit donc le savoir. Je dois faire la correspondance entre virgule et (, OU virgule et lettre suivie d'un point. ("T.")

Voici les données que j'ai:

Doe, John (SUP)
Doe, John T. (SUP)
Doe, John Smith (SUP)
Doe, John Smith T. (SUP)
Doe, John-Smith (SUP)
Doe, John-Smith T. (SUP)

Je dois faire correspondre juste le prénom de cela. Ce serait donc comme ceci:

John
John
John Smith
John Smith
John-Smith
John-Smith

Voici le code que j'ai jusqu'à présent:

var nameLinkAdd = nameLink.match(/\,(.*?)\(/g);

Aucune suggestion? Merci!

0
zen 21 déc. 2011 à 04:19

3 réponses

Meilleure réponse

Cela fonctionnera si vous n'avez pas nécessairement le (SUP) après. C'est-à-dire que cela fonctionnerait

Doe, John
Doe, John-Smith

nameLink.match(/\, *([A-Za-z]+(?:[- ]+[A-Za-z]+\b(?!\.))*)/)'

Le (?!.) s'assure que vous ne capturez rien suivi d'un point ..

Si vous voulez éviter les contournements (cela pourrait être un problème de vitesse, bien qu'avec des chaînes aussi courtes, je ne pense pas), essayez:

nameLink.match(/\, *([A-Z][a-z]+(?:[- ]+[A-Z][a-z]+)*)/)'

Cependant, cela suppose que tous les noms ont plus d'une lettre et commencent par une majuscule suivie par des minuscules (ce qui semble raisonnable, y a-t-il des noms avec des lettres majuscules internes ou des noms composés d'une seule lettre?)

0
mathematical.coffee 21 déc. 2011 à 00:31

J'aime utiliser http://regexpal.com/ pour trouver une expression régulière.

0
jwhat 21 déc. 2011 à 00:22

Essayer:

nameLink.match(/^(\w+(?:\s*\w+)*)\s+(?:\w\. )?\()/);

Ce que vous voulez sera dans le groupe 1.

normal* (special normal*)* à nouveau;)

  • normal = \w
  • spécial = \s*
0
fge 21 déc. 2011 à 00:32
8583681