文字列がいくつかの接頭辞のいずれかで始まるかどうかを確認するにはどうすればよいですか?


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を使用してください...
Adam

回答:


176

これはどういう意味ですか:

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

または、正規表現を使用することもできます。

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

2
提案した2つの方法にパフォーマンスの違いはありますか?
TheCrazyProgrammer 2016年

6
@TheCrazyProgrammerもちろんあります。正規表現によるマッチングは、生の文字列メソッド呼び出しよりもはるかにコストがかかります。正確な数値を示すことはできませんが、これは一般的なコンセンサスです。
klaar 2016年

52

すでに提示されているソリューションに加えて、Apache Commons Langライブラリを使用できます。

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

更新:ある時点での可変引数の導入により、呼び出しが簡単になりました。

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

31

Stream今のところ誰も言及していないので、ここにそれがあります:

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

6
すばらしい(そして最新の)回答... わかりやすくs -> newStr4.startsWith(s)するために置き換えることができますnewStr7::startsWith
Jordi Castilla

ここでどのようにしてCaseを無視できますか?
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
Brendan Long

2
:)このような短いリストのためのやり過ぎのビットを@BrendanLongが、[OK]を
オスカル・ロペス

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.