web-dev-qa-db-ja.com

Javaでは、文字列にサブストリングが含まれているかどうかをどうやって確認すればよいですか(大文字小文字の区別はありません)。

私は2つのStringstr1str2を持っています。大文字と小文字を区別せずに、str2str1内に含まれているかどうかをどうやって確認するのですか?

495
trinity
str1.toLowerCase().contains(str2.toLowerCase())
990
Igor Artamonov

matches()はどうですか?

String string = "Madam, I am Adam";

// Starts with
boolean  b = string.startsWith("Mad");  // true

// Ends with
b = string.endsWith("dam");             // true

// Anywhere
b = string.indexOf("I am") >= 0;        // true

// To ignore case, regular expressions must be used

// Starts with
b = string.matches("(?i)mad.*");

// Ends with
b = string.matches("(?i).*adam");

// Anywhere
b = string.matches("(?i).*i am.*");
122
Jim Raynor

org.Apache.commons.lang.StringUtils を使用できる場合は、以下を使用することをお勧めします。

String container = "aBcDeFg";
String content = "dE";
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);
30
Mojo

toLowerCase()メソッドを使うことができます:

public boolean contains( String haystack, String needle ) {
  haystack = haystack == null ? "" : haystack;
  needle = needle == null ? "" : needle;

  // Works, but is not the best.
  //return haystack.toLowerCase().indexOf( needle.toLowerCase() ) > -1

  return haystack.toLowerCase().contains( needle.toLowerCase() )
}

それからそれを使ってそれを呼び出します:

if( contains( str1, str2 ) ) {
  System.out.println( "Found " + str2 + " within " + str1 + "." );
}

独自のメソッドを作成することでそれを再利用できることに注意してください。それから、誰かがあなたがcontainsの代わりにindexOfを使うべきであると指摘するとき、あなたは変更するために1行のコードしか持っていません。

20

私はまたRegExソリューションを支持します。コードはずっときれいになります。文字列は不変でコピーする必要があるため、文字列が大きくなることがわかっている状況では、toLowerCase()を使用することを躊躇します。また、matches()ソリューションは引数として正規表現を取るので混乱を招く可能性があります( "Need $ le"を検索するのは難しいかもしれません)。

上記の例のいくつかを基にしてください。

public boolean containsIgnoreCase( String haystack, String needle ) {
  if(needle.equals(""))
    return true;
  if(haystack == null || needle == null || haystack .equals(""))
    return false; 

  Pattern p = Pattern.compile(needle,Pattern.CASE_INSENSITIVE+Pattern.LITERAL);
  Matcher m = p.matcher(haystack);
  return m.find();
}

example call: 

String needle = "Need$le";
String haystack = "This is a haystack that might have a need$le in it.";
if( containsIgnoreCase( haystack, needle) ) {
  System.out.println( "Found " + needle + " within " + haystack + "." );
}

(注:必要に応じて、NULL文字列と空の文字列を異なる方法で処理することをお勧めします。文字列のJava仕様により近い方法であると私は思います。)

スピード重視の解決策は、針の最初の文字を探すために干し草の山の文字を文字ごとに繰り返すことを含みます。最初の文字が一致したとき(大文字と小文字を区別しない)、干し草の山の中から対応する文字を探し、すべての文字が一致した場合は "true"を返して、1文字ずつ繰り返します。一致しない文字が見つかった場合は、次の文字で干し草の山から繰り返しを再開し、位置> haystack.length() - needle.length()に達した場合は "false"を返します。

10
Michael Cooper

Stringクラスの一部であるcontainsメソッドとtoUpperメソッドを組み合わせて使用​​します。例を以下に示します。

String string1 = "AAABBBCCC"; 
String string2 = "DDDEEEFFF";
String searchForThis = "AABB";

System.out.println("Search1="+string1.toUpperCase().contains(searchForThis.toUpperCase()));

System.out.println("Search2="+string2.toUpperCase().contains(searchForThis.toUpperCase()));

これは戻ります:

Search1 = true
Search2 = false

6
SOA Nerd