Как проверить, начинается ли строка с одного из нескольких префиксов?

101

У меня есть следующий оператор if:

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

Я хочу включить его startsWith Mon Tues Weds Thurs Fridayи т. Д. Есть ли простой способ сделать это при использовании строк? Я пробовал, ||но ничего не вышло.

ФредБоунс
источник
4
Вы имеете в виду, что пробовали "Mon||Tues"и т.д.? Или ты пользовался newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...? В любом случае дайте определение «это не сработало».
Thomas
Вы случайно не пытаетесь разобрать дату ?? В таком случае используйте SimpleDateFormat ...
Адам,

Ответы:

176

Вы имеете в виду это:

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

Или вы можете использовать регулярное выражение:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))
hmjd
источник
2
Есть ли разница в производительности двух предложенных вами методов?
TheCrazyProgrammer 02
6
@TheCrazyProgrammer Конечно, есть; сопоставление с помощью регулярных выражений намного дороже, чем вызов метода необработанной строки. Точных цифр я назвать не могу, но это общее мнение.
klaar
52

Помимо уже представленных решений, вы можете использовать библиотеку Apache Commons Lang:

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

Обновление: введение varargs в какой-то момент упрощает вызов:

StringUtils.startsWithAny(newStr4, "Mon", "Tues",...)
Томас
источник
31

Пока никто не упомянул Stream, так что вот оно:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))
Дейвут
источник
6
отличный (и современный) ответ ... кстати s -> newStr4.startsWith(s), newStr7::startsWithдля
Жорди Кастилья
Как я могу здесь игнорироватьCase?
happybuddha
Вы можете использовать функцию String toLowerCase ().
Илья Копысов
7

Простое решение:

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

Более интересным решением будет:

List<String> days = Arrays.asList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT");
String day = newStr4.substring(0, 3).toUpperCase();
if (days.contains(day)) {
    // ...
}
Оскар Лопес
источник
3
Или Arrays.binarySearch (), если список поиска отсортирован: D
Брендан Лонг,
2
@BrendanLong - перебор для такого короткого списка, но ладно :)
Оскар Лопес,
3

Конечно, помните, что ваша программа будет полезна только в англоязычных странах, если вы определите даты таким образом. Возможно, вы захотите рассмотреть:

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

Оттуда вы можете использовать .startsWith или .matches или любой другой метод, упомянутый выше. Таким образом вы получите локаль по умолчанию для jvm. Вы всегда можете передать языковой стандарт (и, возможно, по умолчанию использовать языковой стандарт системы, если он равен нулю), а также для большей надежности.

Мэтт
источник
1
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || newStr4.startsWith("Weds") .. etc)

Вам нужно включить все str.startsWith(otherStr)для каждого элемента, поскольку ||работает только с логическими выражениями (true или false).

Есть и другие варианты, если вам нужно многое проверить, например регулярные выражения , но они, как правило, работают медленнее, а более сложные регулярные выражения обычно труднее читать.

Пример регулярного выражения для определения сокращений названий дней:

if(Pattern.matches("Mon|Tues|Wed|Thurs|Fri", stringToCheck)) {
Брендан Лонг
источник
0

Когда вы говорите, что пытались использовать ИЛИ, как именно вы пытались его использовать? В вашем случае вам нужно будет сделать что-то вроде этого:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
npinti
источник