如何检查一个字符串是否以几个前缀中的一个开头?

我有以下 if 陈述:

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

我想它包括 startsWith Mon Tues Weds Thurs Friday等。在使用字符串时,有没有一种简单的方法可以做到这一点?我试过 ||,但没用。

208644 次浏览

一个简单的解决办法是:

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)) {
// ...
}
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)) {

当你说你试图使用手术室的时候,你到底是怎么使用它的?在你的情况下,你需要做的事情是这样的:

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

你是说:

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

Or you could use regular expression:

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

除了已经提供的解决方案之外,您还可以使用 Apache Commons Lang 库:

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

更新: 在某些时候引入 varargs 使得调用变得更加简单:

StringUtils.startsWithAny(newStr4, "Mon", "Tues",...)

当然,请注意,如果你用这种方式检测日期,你的程序只有在英语国家才有用。你可以考虑一下:

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

从那里你可以使用。开始于或者。匹配或任何其他方法,其他人提到了上述。通过这种方式,您可以获得 jvm 的默认语言环境。您总是可以传递区域设置(如果它为 null,则可能默认为系统区域设置) ,以便更加健壮。

到目前为止还没有人提到 Stream,所以这里是:

if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri").anyMatch(s -> newStr4.startsWith(s)))

就是 更简单更整洁这样:

let newStr4 = strr.split("2012")[0];
if (['Mon', 'Tues', 'Weds', 'Thurs', 'Friday'].some(word => newStr4.startsWith(word))) {
str4.add(newStr4);
}

如果您已经有一个元素列表,请调用 stream() on the list itself:

List<String> myItems = Arrays.asList("a", "b", "c");

像这样:

boolean result = myItems.stream().anyMatch(s -> newArg4.startsWith(s));

而不是使用 Stream.of...

如果任务是检查字符串是否匹配忽略大小写的多个值中的任何一个,则有两个选项:

  1. Based on the answer by dejvuth, you can do a batch-checking ignoring case as follows:
    if (Stream.of("Mon", "Tues", "Wed", "Thurs", "Fri")
.anyMatch(s -> StringUtils.startsWithIgnoreCase(newStr4, s)));
  1. 根据 StringUtils 中的实现使用以下方法:

    public static boolean startsWithAnyIgnoreCase(
    CharSequence sequence, CharSequence... searchStrings) {
    if (!isEmpty(sequence) && !ArrayUtils.isEmpty(searchStrings)) {
    CharSequence[] searchStringsArray = searchStrings;
    int length = searchStrings.length;
    
    
    for (int i = 0; i < length; ++i) {
    CharSequence searchString = searchStringsArray[i];
    if (startsWithIgnoreCase(sequence, searchString)) {
    return true;
    }
    }
    }
    return false;
    }