大文字小文字を区別せずに `string.startsWith()`メソッドを使用するにはどうすればよいですか?


115

私はstring.startsWith()メソッドを使用したいが、大文字小文字を無視します。

String「Session」がありstartsWith、「sEsSi」で使用すると仮定すると、が返されtrueます。

どうすればこれを達成できますか?


5
この質問を閉じる理由はありませんでした。とにかく、最善の解決策は、string.regionMatches(true, 0, prefix, 0, prefix.length());両方の文字列を「正規化」するコストが発生しない方法を使用することです。
isapir 16

@AlexanderAbakumovファインバイミー。上記の私のコメントに正解が投稿されています。文字列の大文字と小文字を変更するよりもはるかに効率的です。コメントではなく回答にアップグレードすることをお勧めします。
isapir 2018年

回答:


98

テストする前に、toUpperCase()またはtoLowerCase()を使用して文字列を標準化します。


8
ここでの大きな問題はパフォーマンスです。小さな文字列の場合は問題ありませんが、大きな文字列がある場合...つまり...実際に1mb文字列でtoUpperCaseを実行して、4〜10の初期文字を比較しますか?
Dyorgio 2016

4
なぜ1mb文字列の最初の部分を比較したいのかわからない場合でも、最初の4〜10文字だけに関心がある場合は、部分文字列を使用して正規化して完了します...
Nemesis

3
この答え(およびここにある他のすべての答え)は誤りです。の実装を見ると、最終的に返す前に、文字列の小文字バージョンと大文字バージョンの両方String.equalsIgnoreCase()を比較する必要があることがわかります。別の回答については、stackoverflow.com / a / 38947571/14731を参照してください。false
ギリ

10
toLowerCase()は内部でLocale.getDefault()を使用して文字を変更するため、この答えは当てはまりません。これは、偽陰性につながる可能性があります。「イスタンブール」と「イスタンブール」を比較するとします。トルコ語の「İ」の小文字は「ı」です。したがって、"İstanbul".toLowerCase().startsWith("istanbul".toLowerCase())(Locale.Turkish環境で)それを行おうとすると、誤った結果になります。
Mustafa Berkay Mutlu

1
@ネメシス、この答えは間違っています、受け入れられた答えとしてそれを持っていることは多くの人々にとって誤解を招く可能性があります。回答を編集して、Rohit Jain回答にリンクしてください。
Moha全能のラクダ

88

1つのオプションは、両方を小文字または大文字に変換することです。

"Session".toLowerCase().startsWith("sEsSi".toLowerCase());

これは間違っています。参照:https : //stackoverflow.com/a/15518878/14731


別のオプションは、String#regionMatches()大文字と小文字を区別するマッチングを行うかどうかを示すブール引数を取るメソッドを使用することです。次のように使用できます。

String haystack = "Session";
String needle = "sEsSi";
System.out.println(haystack.regionMatches(true, 0, needle, 0, 5));  // true

それはの領域かどうかをチェックするneedleインデックスから0までの長さ5で存在するhaystackインデックスから始まる0長さまで5、またはしません。最初の引数はでtrue、大文字と小文字を区別しないマッチングを行います。


そして、あなただけがRegexの大ファンであるなら、あなたはこのようなことをすることができます:

System.out.println(haystack.matches("(?i)" + Pattern.quote(needle) + ".*"));

(?i) 埋め込まれたフラグは、大文字小文字の区別を無視するためのものです。


1
実際には、1ラックエントリを超えるテーブルがあり、特定の列でforループを使用してそれらのすべてのエントリを解析するとします。その中で、この小文字のオプションを使用して、特定のパターンで始まるエントリを検索しようとします。したがって、これはパフォーマンスの問題を引き起こしています。一致するものがまったく見つからない場合、内部ですべてのエントリが解析されますが、同時に小文字にも変換されるため、多くの時間がかかります。パフォーマンスの問題を解決するために、他に選択肢はありますか?
Sheetal Bhatewara 2013年

@Rohit Jain、実際にはこれ System.out.println("Session".toLowerCase().startsWith("sEsSi".toLowerCase()));は適切な解決策ではありません。これを試すことができます: System.out.println("SessIon".toLowerCase().startsWith("sEsSi".toLowerCase()));vm引数を使用-Duser.country=TR -Duser.language=tr この例でIは大文字ですi
DPM



1

私は遅れていることを知っていますが、Apache Commons Lang 3のStringUtils.startsWithIgnoreCase()を使用するのはどうですか?

例:

StringUtils.startsWithIgnoreCase(string, "start");

次の依存関係をpom.xmlファイルに追加するだけです(Mavenを使用するという仮説を取ります)。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>



-1

を使用して開始し、toLowerCaseを一緒に

このような

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