char c = string.charAt(0);
isDigit =(c >='0'&& c <='9');
Ou les solutions regex plus lentes:
s.substring(0,1).matches("\\d")// or the equivalent
s.substring(0,1).matches("[0-9]")
Cependant, avec l'une de ces méthodes, vous devez d'abord vous assurer que la chaîne n'est pas vide. Si c'est le cas, charAt(0)et substring(0, 1)lancera un fichier StringIndexOutOfBoundsException. startsWithn'a pas ce problème.
Pour rendre la condition entière une ligne et éviter les vérifications de longueur, vous pouvez modifier les expressions régulières comme suit:
s.matches("\\d.*")// or the equivalent
s.matches("[0-9].*")
Si la condition n'apparaît pas dans une boucle serrée dans votre programme, le petit impact sur les performances lié à l'utilisation d'expressions régulières ne sera probablement pas perceptible.
Re: "vous devez d'abord vous assurer que la chaîne n'est pas vide" - vrai et plus encore - vous devez également vous assurer que ce n'est pas nul comme si c'était le cas, toutes les méthodes affichées lèveraient des exceptions. Vous pouvez soit vérifier directement (par exemple ((null!=s) && Character.isDigit(s.charAt(0)) )), soit utiliser des astuces commeCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8
Les expressions régulières sont un outil très puissant mais coûteux. Il est valide de les utiliser pour vérifier si le premier caractère est un chiffre mais ce n'est pas si élégant :) Je préfère cette façon:
publicboolean isLeadingDigit(finalString value){finalchar c = value.charAt(0);return(c >='0'&& c <='9');}
1) functionn'est pas Java. 2) Cela n'autorise que les chiffres arabes, pas le chinois, l'indien, etc. C'est peut-être ce que vous préférez, mais ce n'est pas spécifié dans la question. 3) J'ai déjà couvert cette solution exacte dans ma réponse il y a quatre ans.
Michael Myers
0
regular expression starts with number->'^[0-9]'Pattern pattern =Pattern.compile('^[0-9]');Matcher matcher = pattern.matcher(String);if(matcher.find()){System.out.println("true");}
Vous n'avez pas besoin du {1,1}suffixe, ce qui signifie que "le motif précédent doit apparaître entre 1 et 1 fois". Cela signifie exactement la même chose que le modèle seul.
Andrzej Doyle
Cette solution ne fonctionne pas car String.matches et l'API Pattern essaient de faire correspondre la chaîne complète et pas seulement le premier caractère
Amrish Pandey
0
Je viens de tomber sur cette question et j'ai pensé à contribuer avec une solution qui n'utilise pas de regex.
Dans mon cas, j'utilise une méthode d'aide:
publicboolean notNumber(String input){boolean notNumber =false;try{// must not start with a number@SuppressWarnings("unused")double checker =Double.valueOf(input.substring(0,1));}catch(Exception e){
notNumber =true;}return notNumber;}
Probablement une exagération, mais j'essaie d'éviter les regex chaque fois que je le peux.
Réponses:
Notez que cela autorisera n'importe quel chiffre Unicode , pas seulement 0-9. Vous pourriez préférer:
Ou les solutions regex plus lentes:
Cependant, avec l'une de ces méthodes, vous devez d'abord vous assurer que la chaîne n'est pas vide. Si c'est le cas,
charAt(0)
etsubstring(0, 1)
lancera un fichierStringIndexOutOfBoundsException
.startsWith
n'a pas ce problème.Pour rendre la condition entière une ligne et éviter les vérifications de longueur, vous pouvez modifier les expressions régulières comme suit:
Si la condition n'apparaît pas dans une boucle serrée dans votre programme, le petit impact sur les performances lié à l'utilisation d'expressions régulières ne sera probablement pas perceptible.
la source
((null!=s) && Character.isDigit(s.charAt(0)) )
), soit utiliser des astuces commeCharacter.isDigit((s?s:"X").charAt(0))
Les expressions régulières sont un outil très puissant mais coûteux. Il est valide de les utiliser pour vérifier si le premier caractère est un chiffre mais ce n'est pas si élégant :) Je préfère cette façon:
la source
function
n'est pas Java. 2) Cela n'autorise que les chiffres arabes, pas le chinois, l'indien, etc. C'est peut-être ce que vous préférez, mais ce n'est pas spécifié dans la question. 3) J'ai déjà couvert cette solution exacte dans ma réponse il y a quatre ans.la source
{1,1}
suffixe, ce qui signifie que "le motif précédent doit apparaître entre 1 et 1 fois". Cela signifie exactement la même chose que le modèle seul.Je viens de tomber sur cette question et j'ai pensé à contribuer avec une solution qui n'utilise pas de regex.
Dans mon cas, j'utilise une méthode d'aide:
Probablement une exagération, mais j'essaie d'éviter les regex chaque fois que je le peux.
la source