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

Posted

技术标签:

【中文标题】如何检查字符串是不是以多个前缀之一开头?【英文标题】:How to check if a string starts with one of several prefixes?如何检查字符串是否以多个前缀之一开头? 【发布时间】:2012-04-05 03:26:26 【问题描述】:

我有以下 if 语句:

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

我希望它包含 startsWith Mon Tues Weds Thurs Friday 等。在使用字符串时有没有简单的方法?我试过||,但没用。

【问题讨论】:

你的意思是你试过"Mon||Tues"等等?还是您使用了newStr4.startsWith("Mon")||newStr4.startsWith("Tues") ...?无论哪种方式,请定义“它不起作用”。 您是否试图解析日期?如果是这样,请使用 SimpleDateFormat... 【参考方案1】:

一个简单的解决方案是:

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

【讨论】:

或Arrays.binarySearch(),如果他们的搜索列表已排序:D @BrendanLong 对于这样一个简短的列表来说有点矫枉过正,但没关系:)【参考方案2】:
if(newStr4.startsWith("Mon") || newStr4.startsWith("Tues") || newStr4.startsWith("Weds") .. etc)

您需要为每个项目包含整个 str.startsWith(otherStr),因为 || 仅适用于布尔表达式(true 或 false)。

如果您有很多东西要检查,还有其他选项,例如 regular expressions,但它们往往速度较慢,更复杂的正则表达式通常更难阅读。

检测日期名称缩写的正则表达式示例如下:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

你是这个意思吗:

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

或者你可以使用正则表达式:

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

【讨论】:

您建议的两种方法有性能差异吗? @TheCrazyProgrammer 当然有;通过正则表达式进行匹配比原始字符串方法调用要昂贵得多。我无法给出确切的数字,但这是普遍共识。【参考方案5】:

除了已经介绍的解决方案,您还可以使用 Apache Commons Lang 库:

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

更新:在某些时候引入可变参数使调用变得更简单:

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

很棒的(和最新的)答案...顺便说一句,s -&gt; newStr4.startsWith(s) 可以替换为newStr7::startsWith 更清楚 这里如何忽略大小写? 可以使用 String toLowerCase() 函数。【参考方案8】:

这样更简单更整洁

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

【讨论】:

【参考方案9】:

如果您已经有一个元素列表,请致电stream() 列表本身

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

像这样:

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

而不是使用Stream.of...

【讨论】:

以上是关于如何检查字符串是不是以多个前缀之一开头?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 CComBSTR 是不是以某个前缀开头?

如何检查字符串是不是以回文开头?

如何检查变量是不是以特定字符串开头? [复制]

在 Bash 中,如何检查字符串是不是以某个值开头?

如何检查单词是不是以给定字符开头?

如何检查一个字符串是不是以另一个字符串开头 - PHP