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!
3 Réponses :
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 Test Sortie (? lookbehind positif de largeur zéro et
(? = X)
lookahead positif de largeur zéro. 1234-Foo-â
¯â
â
â
©â
©â
©â
£-á¸ÃµÃ´
System.out.println(addHyphen("1234Fooâ
¯â
â
â
©â
©â
©â
£á¸ÃµÃ´"));
"(?<=\\p{L})(?=\\p{N})|(?<=\\p{N})(?=\\p{L})"
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).
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); }
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.
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?