Comment vérifier si une chaîne commence par l'un des plusieurs préfixes?

101

J'ai la déclaration if suivante:

String newStr4 = strr.split("2012")[0];
if (newStr4.startsWith("Mon")) {
    str4.add(newStr4);
}

Je veux qu'il inclue startsWith Mon Tues Weds Thurs Fridayetc. Existe-t-il un moyen simple de le faire lors de l'utilisation de chaînes? J'ai essayé ||mais ça n'a pas marché.

FredBones
la source
4
Vous voulez dire que vous avez essayé "Mon||Tues"etc.? Ou avez-vous utilisé newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? Dans tous les cas, veuillez définir «cela n'a pas fonctionné».
Thomas
Essayez-vous d'analyser une date par hasard? Si c'est le cas, utilisez SimpleDateFormat ...
Adam

Réponses:

176

Est-ce que tu veut dire ça:

if (newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || ...)

Ou vous pouvez utiliser une expression régulière:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))
hmjd
la source
2
Y a-t-il une différence de performance entre les deux méthodes que vous avez suggérées?
TheCrazyProgrammer
6
@TheCrazyProgrammer Bien sûr, il y en a; la correspondance via des expressions régulières est beaucoup plus coûteuse que les appels de méthode de chaîne brute. Des chiffres exacts que je ne peux pas donner, mais c'est le consensus général.
klaar
52

Outre les solutions déjà présentées, vous pouvez utiliser la bibliothèque Apache Commons Lang:

if(StringUtils.startsWithAny(newStr4, new String[] {"Mon","Tues",...})) {
  //whatever
}

Mise à jour: l'introduction de varargs à un moment donné rend l'appel plus simple maintenant:

StringUtils.startsWithAny(newStr4, "Mon", "Tues",...)
Thomas
la source
31

Personne n'a mentionné Streamjusqu'à présent, alors le voici:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))
dejvuth
la source
6
bonne réponse (et à jour) ... btw s -> newStr4.startsWith(s)peut être remplacé par newStr7::startsWithpour être plus clair
Jordi Castilla
Comment puis-je ignorerCase ici?
happybuddha
Vous pouvez utiliser la fonction String toLowerCase ().
Ilia Kopysov
7

Une solution simple est:

if (newStr4.startsWith("Mon") || newStr4.startsWith("Tue") || newStr4.startsWith("Wed"))
// ... you get the idea ...

Une solution plus sophistiquée serait:

List<String> days = Arrays.asList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT");
String day = newStr4.substring(0, 3).toUpperCase();
if (days.contains(day)) {
    // ...
}
Óscar López
la source
3
Ou Arrays.binarySearch () si la liste de recherche est triée: D
Brendan Long
2
@BrendanLong un peu exagéré pour une si courte liste, mais ok :)
Óscar López
3

Bien sûr, sachez que votre programme ne sera utile dans les pays anglophones que si vous détectez les dates de cette façon. Vous voudrez peut-être envisager:

Set<String> dayNames = Calendar.getInstance()
 .getDisplayNames(Calendar.DAY_OF_WEEK,
      Calendar.SHORT,
      Locale.getDefault())
 .keySet();

De là, vous pouvez utiliser .startsWith ou .matches ou toute autre méthode que d'autres ont mentionnée ci-dessus. De cette façon, vous obtenez les paramètres régionaux par défaut pour le jvm. Vous pouvez toujours passer la locale (et peut-être par défaut la locale si elle est nulle) ainsi pour être plus robuste.

Mat
la source
1
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || newStr4.startsWith("Weds") .. etc)

Vous devez inclure le tout str.startsWith(otherStr)pour chaque élément, car ||ne fonctionne qu'avec des expressions booléennes (vrai ou faux).

Il existe d'autres options si vous avez beaucoup de choses à vérifier, comme les expressions régulières , mais elles ont tendance à être plus lentes et les expressions régulières plus compliquées sont généralement plus difficiles à lire.

Un exemple d'expression régulière pour détecter les abréviations de nom de jour serait:

if(Pattern.matches("Mon|Tues|Wed|Thurs|Fri", stringToCheck)) {
Brendan Long
la source
0

Quand vous dites que vous avez essayé d'utiliser OR, comment avez-vous essayé de l'utiliser exactement? Dans votre cas, ce que vous devrez faire serait quelque chose comme ceci:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
npinti
la source