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


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

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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.