2010-11-14 6 views

Répondre

0

Puisque vous ne l'avez pas spécifier une langue, voici une avec Ruby:

ruby-1.9.2-p0 > "toto123".gsub(/([a-z]+)(\d+)/i, '\1 \2') 
=> "toto 123" 

Mais dans une autre langue, il est très similaire.

+0

merci les gars de l'ex Reg je besoin sont en JAVA – sdblepas

+0

merci beaucoup – sdblepas

+0

si elles sont utiles, au moins jusqu'à voter la réponse s'il vous plaît –

3

Rechercher

(?<=[a-zA-Z])(?=[0-9]) 

et le remplacer par un espace. Si vous voulez aussi diviser 100toto, puis utilisez

(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z]) 

Ce regex est à la recherche d'une position qui est juste après une lettre et juste avant un chiffre. Comme il ne doit pas correspondre, conserver et remplacer tout texte réel, mais insère juste un espace dans une position entre deux caractères, c'est assez rapide. Comme suggéré par tchrist, bien sûr, il est préférable de ne pas vous limiter aux lettres et chiffres ASCII, surtout si la langue que vous utilisez supporte Unicode dans les expressions régulières (comme le fait Java).

Ainsi, la seconde regex ressemble

(?<=\p{L])(?=\p{N})|(?<=\p{N})(?=\p{L}) 

En Java:

String result = subject.replaceAll("(?<=\\p{L])(?=\\p{N})|(?<=\\p{N})(?=\\p{L})", " "); 
+0

merci beaucoup – sdblepas

+0

Vous avez * vraiment * besoin d'utiliser '\ pL' pour les lettres. Chaque fois que vous voyez quelqu'un écrire '[a-z]' ou '[A-Z]' dans une expression régulière, c'est virtuellement * toujours * faux. ''unichars -a '\ pL' '[^ a-zA-Z]' | wc -l'' renvoie ** 12,917 points de code que vous avez oublié! ** – tchrist

+0

@tchrist: Droit. Quand la question a été posée, il n'y avait aucune mention de Java, et je n'ai pas retravaillé la réponse entière quand ce peu d'information a été ajouté. –

1

Pour reprendre la solution de Tim mais corrections apportées pour gérer l'ASCII de plus de 1970 - rappelez-vous, les caractères Java sont Unicode, vous avez pour tenir compte de cela - donne cette solution simple:

String new = old.replaceAll("(?x) (?<= \\pL) (?= \\pN) | (?<= \\pN) (?= \\pL)", " "); 

et ce plus-maintai nable et version moins-fou:

String new = old.replaceAll(
       "(?x)   # enable comment mode   \n" 

       + " # LOOK FOR EITHER:       \n" 

       + " (?<= \\pL) #  a letter right behind \n" 
       + " (?= \\pN) # AND a number right ahead \n" 

       + " |    # OR ELSE     \n" 

       + " (?<= \\pN) #  a number right behind \n" 
       + " (?= \\pL) # AND a letter right ahead \n" 

       + "",    // placeholder so comma doesn't get lost 

       " ");   // replaced with a single space 

que je suppose que vous pourriez écrire comme ça il est donc pas indenté loin:

String new = old.replaceAll(
    "(?x)   # enable comment mode   \n" 

    + "    # LOOK FOR EITHER:   \n" 

    + " (?<= \\pL) #  a letter right behind \n" 
    + " (?= \\pN) # AND a number right ahead \n" 

    + " |    # OR ELSE     \n" 

    + " (?<= \\pN) #  a number right behind \n" 
    + " (?= \\pL) # AND a letter right ahead \n" 

    + "",    // placeholder so comma doesn't get lost 

    " ");    // replaced with a single space 

C'est probablement le meilleur que vous allez être en mesure de le faire, étant donné comment horriblement mal adapté Java est à ce genre de travail. Si vous avez seulement utilisé Java, vous ne savez probablement pas à quel point c'est méchant. Ici, en comparaison est ce que la même opération ressemble dans une langue qui était en fait conçu avec regexes à l'esprit:

($new = $old) =~ s{ # LOOK FOR EITHER: 
    (?<= \pL)  #  a letter right behind 
    (?= \pN)  # AND a number right ahead 
    |     # OR ELSE:  
    (?<= \pN)  #  a number right behind 
    (?= \pL)  # AND a letter right ahead 
}{ }xg;    # THEN insert a single space 

Voir toutes les nombreuses, beaucoup différences cruciales? Simplement stupéfiant, n'est-ce pas?

I peut peut regex travailler en assembleur si je veux, aussi; en fait, j'ai. C'est à peu près aussi amusant que Java, vraiment. Faire un travail de regex à Java, c'est trop apprendre à chanter un cochon: c'est une perte de temps et cela dérange le cochon; cela agace aussi tout le monde, y compris vous.

Apprendre à utiliser le bon outil pour la bonne tâche est ce qui sépare le programmeur professionnel du code singe. La vie est trop courte pour te battre la tête contre un mur de briques.

Questions connexes