indexOf(String) メソッドは大文字と小文字を区別しますか? もしそうなら、それの大文字と小文字を区別しないバージョンはありますか?
19 に答える
メソッドはindexOf()
すべて大文字と小文字を区別します。事前に文字列を大文字/小文字に変換することで、大文字と小文字を区別しないようにすることができます(大まかに言えば、壊れた方法ですが、多くの場合に機能します)。
s1 = s1.toLowerCase(Locale.US);
s2 = s2.toLowerCase(Locale.US);
s1.indexOf(s2);
indexOf(String) メソッドは大文字と小文字を区別しますか?
はい、大文字と小文字が区別されます。
@Test
public void indexOfIsCaseSensitive() {
assertTrue("Hello World!".indexOf("Hello") != -1);
assertTrue("Hello World!".indexOf("hello") == -1);
}
もしそうなら、それの大文字と小文字を区別しないバージョンはありますか?
いいえ、ありません。indexOf を呼び出す前に、両方の文字列を小文字に変換できます。
@Test
public void caseInsensitiveIndexOf() {
assertTrue("Hello World!".toLowerCase().indexOf("Hello".toLowerCase()) != -1);
assertTrue("Hello World!".toLowerCase().indexOf("hello".toLowerCase()) != -1);
}
Apache Commons Lang ライブラリの StringUtils クラスに ignore case メソッドがあります
indexOfIgnoreCase(CharSequence str, CharSequence searchStr)
はい、indexOf
大文字と小文字が区別されます。
私が見つけた大文字と小文字を区別しない最善の方法は次のとおりです。
String original;
int idx = original.toLowerCase().indexOf(someStr.toLowerCase());
これにより、大文字と小文字が区別されなくなりますindexOf()
。
同じ問題がありました。正規表現と apache StringUtils.indexOfIgnoreCase-Method を試しましたが、どちらもかなり遅かったので、自分で短いメソッドを書きました...:
public static int indexOfIgnoreCase(final String chkstr, final String searchStr, int i) {
if (chkstr != null && searchStr != null && i > -1) {
int serchStrLength = searchStr.length();
char[] searchCharLc = new char[serchStrLength];
char[] searchCharUc = new char[serchStrLength];
searchStr.toUpperCase().getChars(0, serchStrLength, searchCharUc, 0);
searchStr.toLowerCase().getChars(0, serchStrLength, searchCharLc, 0);
int j = 0;
for (int checkStrLength = chkstr.length(); i < checkStrLength; i++) {
char charAt = chkstr.charAt(i);
if (charAt == searchCharLc[j] || charAt == searchCharUc[j]) {
if (++j == serchStrLength) {
return i - j + 1;
}
} else { // faster than: else if (j != 0) {
i = i - j;
j = 0;
}
}
}
return -1;
}
私のテストによると、はるかに高速です...(少なくともsearchStringがかなり短い場合)。改善やバグに関する提案があれば、お知らせいただければ幸いです... (私はこのコードをアプリケーションで使用しているため ;-)
@Test
public void testIndexofCaseSensitive() {
TestCase.assertEquals(-1, "abcDef".indexOf("d") );
}
はい、そうです。標準ライブラリを使用してそれを回避する1つの方法は次のとおりです。
int index = str.toUpperCase().indexOf("FOO");
通常、両方の文字列を小文字に変換することは大したことではありませんが、一部の文字列が長い場合は処理が遅くなります。そして、これをループで行うと、非常に悪いことになります。このため、 をお勧めしindexOfIgnoreCase
ます。