2008-10-30 9 views
2

Je suis à la recherche d'un bon JavaScript RegEx pour convertir les noms en cas appropriés. Par exemple:JS Regex pour les noms humains

John SMITH = John Smith 

Mary O'SMITH = Mary O'Smith 

E.t MCHYPHEN-SMITH = E.T McHyphen-Smith 

John Middlename SMITH = John Middlename SMITH 

Eh bien, vous avez l'idée.

Quelqu'un propose-t-il une solution complète?

Répondre

1

Quelque chose comme ça?

function fix_name(name) { 
    var replacer = function (whole,prefix,word) { 
     ret = []; 
     if (prefix) { 
      ret.push(prefix.charAt(0).toUpperCase()); 
      ret.push(prefix.substr(1).toLowerCase()); 
     } 
     ret.push(word.charAt(0).toUpperCase()); 
     ret.push(word.substr(1).toLowerCase()); 
     return ret.join(''); 
    } 
    var pattern = /\b(ma?c)?([a-z]+)/ig; 
    return name.replace(pattern, replacer); 
} 
0

Malheureusement, il y a trop de formats de noms différents pour le faire correctement. John-Joe MacDonald va toujours être une nuisance!

+0

Vous avez ce droit! Il est toujours le même rapscallion qu'il était à l'école primaire! – eyelidlessness

+1

Vous auriez dû voir ce qu'il a fait à la sacoche de Lilly-Anne da Silva; un petit scallywag! – harriyott

0

D'accord, il ne sera jamais parfait, mais cherche à obtenir les cas les plus courants. Ce qui est à peu près à chameau tout "mot" et gérer les traits d'union et les apostrophes je suppose que les espaces.

0

Wimps! .... Voici ma deuxième tentative. Poignées "John Smith", "Mary O'SMITH" "John middleName SMITH", "Et MCHYPHEN-SMITH" et "JoHn-JOE MACDONALD"

Regex fixnames = new Regex("(Ma?C)?(\w)(\w*)(\W*)"); 
string newName = fixnames.Replace(badName, NameFixer); 


static public string NameFixer(Match match) 
{ 
    string mc = ""; 
    if (match.Groups[1].Captures.Count > 0) 
    { 
     if (match.Groups[1].Captures[0].Length == 3) 
      mc = "Mac"; 
     else 
      mc = "Mc"; 
    } 

    return 
     mc 
     +match.Groups[2].Captures[0].Value.ToUpper() 
     +match.Groups[3].Captures[0].Value.ToLower() 
     +match.Groups[4].Captures[0].Value; 
} 

NOTE: Au moment où j'ai réalisé que vous vouliez une solution Javascript Au lieu d'un. NET, j'ai eu trop drôle pour arrêter ....

+0

Ce n'est pas JavaScript;) En outre, ce n'est vraiment pas le travail pour les expressions régulières seulement - combiné avec l'analyse lexicale, vous pourriez obtenir un système capable de 90%, je pense. –

1

Mark Summerfield a fait un travail complet de ce avec Lingua::EN::NameCase:

KEITH    Keith 
LEIGH-WILLIAMS  Leigh-Williams 
MCCARTHY   McCarthy 
O'CALLAGHAN   O'Callaghan 
ST. JOHN   St. John 
VON STREIT   von Streit 
VAN DYKE   van Dyke 
AP LLWYD DAFYDD  ap Llwyd Dafydd 
henry viii   Henry VIII 
louis xiv   Louis XIV 

Ce qui précède est écrit en Perl, mais il fait un usage intensif des expressions régulières, vous devriez donc être en mesure de glaner quelques bonnes techniques.

Voici la source pertinente:

sub nc { 

    croak "Usage: nc [[\\]\$SCALAR]" 
     if scalar @_ > 1 or (ref $_[0] and ref $_[0] ne 'SCALAR') ; 

    local($_) = @_ if @_ ; 
    $_ = ${$_} if ref($_) ;   # Replace reference with value. 

    $_ = lc ;       # Lowercase the lot. 
    s{ \b (\w) }{\u$1}gox ;   # Uppercase first letter of every word. 
    s{ (\'\w) \b }{\L$1}gox ;   # Lowercase 's. 

    # Name case Mcs and Macs - taken straight from NameParse.pm incl. comments. 
    # Exclude names with 1-2 letters after prefix like Mack, Macky, Mace 
    # Exclude names ending in a,c,i,o, or j are typically Polish or Italian 

    if (/\bMac[A-Za-z]{2,}[^aciozj]\b/o or /\bMc/o) { 
     s/\b(Ma?c)([A-Za-z]+)/$1\u$2/go ; 

     # Now correct for "Mac" exceptions 
     s/\bMacEvicius/Macevicius/go ; # Lithuanian 
     s/\bMacHado/Machado/go ;  # Portuguese 
     s/\bMacHar/Machar/go ; 
     s/\bMacHin/Machin/go ; 
     s/\bMacHlin/Machlin/go ; 
     s/\bMacIas/Macias/go ; 
     s/\bMacIulis/Maciulis/go ; 
     s/\bMacKie/Mackie/go ; 
     s/\bMacKle/Mackle/go ; 
     s/\bMacKlin/Macklin/go ; 
     s/\bMacQuarie/Macquarie/go ; 
    s/\bMacOmber/Macomber/go ; 
    s/\bMacIn/Macin/go ; 
    s/\bMacKintosh/Mackintosh/go ; 
    s/\bMacKen/Macken/go ; 
    s/\bMacHen/Machen/go ; 
    s/\bMacisaac/MacIsaac/go ; 
    s/\bMacHiel/Machiel/go ; 
    s/\bMacIol/Maciol/go ; 
    s/\bMacKell/Mackell/go ; 
    s/\bMacKlem/Macklem/go ; 
    s/\bMacKrell/Mackrell/go ; 
    s/\bMacLin/Maclin/go ; 
    s/\bMacKey/Mackey/go ; 
    s/\bMacKley/Mackley/go ; 
    s/\bMacHell/Machell/go ; 
    s/\bMacHon/Machon/go ; 
    } 
    s/Macmurdo/MacMurdo/go ; 

    # Fixes for "son (daughter) of" etc. in various languages. 
    s{ \b Al(?=\s+\w) }{al}gox ; # al Arabic or forename Al. 
    s{ \b Ap  \b }{ap}gox ;  # ap Welsh. 
    s{ \b Ben(?=\s+\w) }{ben}gox ; # ben Hebrew or forename Ben. 
    s{ \b Dell([ae])\b }{dell$1}gox ; # della and delle Italian. 
    s{ \b D([aeiu]) \b }{d$1}gox ;  # da, de, di Italian; du French. 
    s{ \b De([lr]) \b }{de$1}gox ;  # del Italian; der Dutch/Flemish. 
    s{ \b El  \b }{el}gox unless $SPANISH ; # el Greek or El Spanish. 
    s{ \b La  \b }{la}gox unless $SPANISH ; # la French or La Spanish. 
    s{ \b L([eo]) \b }{l$1}gox ;  # lo Italian; le French. 
    s{ \b Van(?=\s+\w) }{van}gox ; # van German or forename Van. 
    s{ \b Von  \b }{von}gox ; # von Dutch/Flemish 

    # Fixes for roman numeral names, e.g. Henry VIII, up to 89, LXXXIX 
    s{ \b ((?: [Xx]{1,3} | [Xx][Ll] | [Ll][Xx]{0,3})? 
      (?: [Ii]{1,3} | [Ii][VvXx] | [Vv][Ii]{0,3})?) \b }{\U$1}gox ; 

    $_ ; 
} 
Questions connexes