1
votes

Trait d'union entre lettre et chiffre

J'ai besoin d'une fonction pour placer un trait d'union là où les lettres finissent et les chiffres commencent ou lorsque les chiffres finissent et les lettres commencent, par exemple, 1234GRR à 1234-GRR .

J'utilise Java 6.

J'ai ceci, mais cela met juste un trait d'union partout.

public static String addHyphen(String word) {
    StringBuilder longer = new StringBuilder(word.substring(0,1));
    for (int i = 1; i < word.length(); i++) {
      longer.append("-" + word.charAt(i));
    }
    return longer.toString();
}

Quelqu'un peut-il m'aider? Merci!


4 commentaires

La communauté ici s'attend généralement à voir les résultats de vos recherches précédentes et où votre propre tentative de solution, à la suite de cette recherche, a échoué. Cela nous permet d'éviter de proposer des idées que vous avez déjà essayées.


Le problème est que je ne sais pas comment dire à la fonction de mettre un trait d'union lorsque la position suivante change en nombre ou en lettre.


un indice pour vous unicode


vous n'avez aucune logique conditionnelle dans votre code. Comment est-ce censé savoir où mettre le trait d'union s'il ne fait jamais de vérification avec une instruction if?


3 Réponses :


4
votes

La solution la plus simple serait d'utiliser une regex, en supposant bien sûr que vous connaissez regex. Pour localiser un endroit entre deux caractères, nous utilisons (? lookbehind positif de largeur zéro et (? = X) lookahead positif de largeur zéro.

1234-Foo-ⅯⅭⅭⅩⅩⅩⅣ-Ḟõô

Test

System.out.println(addHyphen("1234FooⅯⅭⅭⅩⅩⅩⅣḞõô"));

Sortie

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


2 commentaires

Ne devriez-vous pas vérifier word pour null dans addHyphen pour éviter NullPointerException ?


@ArvindKumarAvinash Non. Eh bien, ce n'est pas à moi de décider si une valeur null est autorisée. Le code de la question ne le permet pas, donc je vais avec cette décision (très courante).



1
votes

Essayez ceci:

public static String addHyphen(String word) {
          boolean words=false;
          boolean number=false;
          String end=new String();
            for (int i = 0; i < word.length(); i++) {
                if (word.substring(i,i+1).matches("[1-9+]")&number==false){
                    number=true;
                    words=false;
                    end=end+"-"+word.substring(i,i+1);
                }else if (word.substring(i,i+1).matches("[a-zA-Z]")&words==false){
                   number=false;
                   words=true;
                    end=end+"-"+word.substring(i,i+1);
                }else {
                    end=end+word.substring(i,i+1); 
                }
            }
            return end.substring(1);
        }


0 commentaires

0
votes

Vous pouvez le faire en utilisant des arguments regex comme indiqué ci-dessous:

1234-GRR
GRR-1234
Hello
Hello-1234-World
1234-GRR-1234-GRR

Sortie:

public class Main {
    public static void main(String[] args) {
        // Test
        String[] testStrs = { "1234GRR", "GRR1234", "Hello", "Hello1234World", "1234GRR1234GRR" };
        for (String s : testStrs) {
            System.out.println(addHyphen(s));
        }
    }

    public static String addHyphen(String word) {
        String str = null;
        if (word != null) {
            str = word.replaceAll("([0-9]+)([A-Za-z]+)", "$1-$2");
            str = str.replaceAll("([A-Za-z]+)([0-9]+)", "$1-$2");
        }
        return str;
    }
}

Remarque : $ 1 et $ 2 font référence au premier et au deuxième groupe de capture respectivement.


0 commentaires