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é.


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).*"))

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",...)

31

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

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))

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)) {
    // ...
}

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.


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)) {

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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.