문자열이 여러 접두사 중 하나로 시작하는지 확인하는 방법은 무엇입니까?


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") ...했습니까? 어느 쪽이든 "작동하지 않음"을 정의하십시오.
토마스

혹시 날짜를 구문 분석하려고합니까 ?? 그래서 ... 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명확하게하기
조르디 스틸라을

여기에서 케이스를 어떻게 무시할 수 있습니까?
happybuddha

String toLowerCase () 함수를 사용할 수 있습니다.
Ilia Kopysov

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)

부울 표현식 (true 또는 false)에서만 작동 str.startsWith(otherStr)하므로 각 항목에 대해 전체를 포함해야합니다 ||.

정규 표현식 과 같이 확인해야 할 사항이 많은 경우 다른 옵션이 있지만 더 느리고 복잡한 정규 표현식은 일반적으로 읽기가 더 어렵습니다.

요일 약어를 감지하는 정규 표현식의 예는 다음과 같습니다.

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

0

OR 사용을 시도했다고했을 때 정확히 얼마나 사용하고 사용 하셨나요? 귀하의 경우에는 다음과 같은 작업을 수행해야합니다.

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.