如何检查字符串是否以多个前缀之一开头?


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 ...
亚当

Answers:


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有点这么短的名单矫枉过正,但确定:)
奥斯卡·洛佩斯

3

当然,请注意,如果您以这种方式检测日期,则该程序仅在英语国家/地区有用。您可能要考虑:

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

从那里,您可以使用.startsWith或.matches或上面其他人提到的任何其他方法。这样,您将获得jvm的默认语言环境。您也可以始终传入语言环境(如果为null,则默认为系统语言环境),以使其更加健壮。


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

当您说尝试使用OR时,您究竟是如何尝试使用它的?在您的情况下,您需要做的是这样的:

String newStr4 = strr.split("2012")[0];
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues")...)
str4.add(newStr4);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.