web-dev-qa-db-fra.com

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

J'ai l'énoncé suivant:

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

Je veux qu'il inclue startsWithMonTuesWedsThrusFriday etc. Y a-t-il un moyen simple de le faire en utilisant des chaînes? J'ai essayé || mais cela n'a pas fonctionné.

86
FredBones

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

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
}
40
Thomas

Personne n'a mentionné Stream jusqu'à présent, alors voici:

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

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)) {
    // ...
}
7
Óscar López

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();

À partir de là, vous pouvez utiliser .startsWith ou. Matches ou toute autre méthode mentionnée ci-dessus. De cette façon, vous obtenez les paramètres régionaux par défaut pour le jvm. Vous pouvez toujours transmettre les paramètres régionaux (et peut-être les définir par défaut sur les paramètres régionaux du système s'ils sont nuls) afin qu'ils soient plus robustes.

3
Matt
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || newStr4.startsWith("Weds") .. etc)

Vous devez inclure l'intégralité de str.startsWith(otherStr) pour chaque élément, car || ne fonctionne qu'avec les expressions booléennes (true ou false).

Il y a d'autres options si vous avez beaucoup de choses à vérifier, comme les expressions rationnelles , 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 permettant de détecter les abréviations des noms de jours serait:

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

Utiliser une liste et startsWithAny ()

Une des solutions serait de mettre tous les préfixes dans une List , puis utilisez la méthode StringUtils startsWithAny () pour faire la vérification pour vous.

List<String> prefixesList = Arrays.asList("Mon", "Tues", "Wed", "Thurs", "Fri");
if(StringUtils.startsWithAny(newStr4, prefixesList.toArray(new String[0])))
{
    // Your code goes here ...
}
0
Loukan ElKadi

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

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