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


101

У мене є таке твердження, якщо:

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") ...? У будь-якому випадку, будь ласка, визначте "це не спрацювало".
Томас

Ви намагаєтесь розібрати побачення випадково ?? Якщо так, використовуйте SimpleDateFormat ...
Адам,

Відповіді:


176

Ви маєте на увазі це:

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

Або ви можете використовувати регулярний вираз:

if (newStr4.matches("(Mon|Tues|Wed|Thurs|Fri).*"))

2
Чи є різниця в продуктивності двох запропонованих вами методів?
TheCrazyProgrammer

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
чудова (і сучасна) відповідь ... btw s -> newStr4.startsWith(s)можна замінити, newStr7::startsWithщоб бути зрозумілішою
Jordi Castilla

Як я можу тут проігнорувати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
Brendan Long

2
@BrendanLong трохи надмірної кількості для такого короткого списку, але гаразд
Óscar López

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)для кожного елемента, оскільки ||працює лише з булевими виразами (правдивими чи помилковими).

Є й інші варіанти, якщо у вас є багато речей для перевірки, як, наприклад, регулярні вирази , але вони, як правило, повільніші та складніші регулярні вирази, як правило, важче читати.

Прикладом регулярного вираження для виявлення скорочень імен дня є:

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.