441

2つの弦があるとしましょう。

String s1 = "AbBaCca";
String s2 = "bac";

s2に含まれているチェックリターンを実行したいs1。私はこれを行うことができます:

return s1.contains(s2);

contains()大文字と小文字が区別されることは間違いありませんが、ドキュメントを読んでもこれを確実に判断することはできません。もしそうなら、私の最善の方法は次のようなものになると思います。

return s1.toLowerCase().contains(s2.toLowerCase());

これはさておき、大文字と小文字を区別せずにこれを実現する別の(おそらくより良い)方法はありますか?

4

20 に答える 20

347

はい、含むには大文字と小文字が区別されます。大文字と小文字を区別しないマッチングには、java.util.regex.PatternをCASE_INSENSITIVEフラグとともに使用できます。

Pattern.compile(Pattern.quote(wantedStr), Pattern.CASE_INSENSITIVE).matcher(source).find();

編集: s2に正規表現の特殊文字(多くあります)が含まれている場合は、最初に引用することが重要です。人々が最初に目にするので私の答えを訂正しましたが、彼がこれを指摘したのでマット・クウェイルに投票してください。

于 2008-09-17T19:41:55.583 に答える
283

Dave L. による回答の問題の 1 つは、s2 に などの正規表現マークアップが含まれている\d場合です。

s2 で Pattern.quote() を呼び出したい場合:

Pattern.compile(Pattern.quote(s2), Pattern.CASE_INSENSITIVE).matcher(s1).find();
于 2008-09-18T07:48:30.127 に答える
196

使用できます

org.apache.commons.lang3.StringUtils.containsIgnoreCase("AbBaCca", "bac");

Apache Commonsライブラリは、この種の作業に非常に役立ちます。そして、正規表現は常にパフォーマンスの点で高価であるため、この特定のものは正規表現よりも優れている可能性があります。

于 2012-03-05T00:36:51.183 に答える
35

これを行う簡単な方法(パターンマッチングを気にせずに)は、両方Stringを小文字に変換することです。

String foobar = "fooBar";
String bar = "FOO";
if (foobar.toLowerCase().contains(bar.toLowerCase()) {
    System.out.println("It's a match!");
}
于 2012-01-16T17:29:04.673 に答える
19

はい、これは達成可能です:

String s1 = "abBaCca";
String s2 = "bac";

String s1Lower = s1;

//s1Lower is exact same string, now convert it to lowercase, I left the s1 intact for print purposes if needed

s1Lower = s1Lower.toLowerCase();

String trueStatement = "FALSE!";
if (s1Lower.contains(s2)) {

    //THIS statement will be TRUE
    trueStatement = "TRUE!"
}

return trueStatement;

このコードは文字列「TRUE!」を返します。あなたのキャラクターが含まれていることが判明したためです。

于 2010-04-15T16:30:39.200 に答える
7

正規表現を使用できますが、次のように機能します。

boolean found = s1.matches("(?i).*" + s2+ ".*");
于 2012-10-20T01:53:54.827 に答える
3

ICU4j をプルした場合に作成できる Unicode 対応のものを次に示します。メソッド名の「大文字と小文字を区別しない」は疑わしいと思います。なぜなら、主要な強度比較では大文字と小文字を区別しませんが、詳細はロケールに依存していると説明されているからです。しかし、うまくいけば、ユーザーが期待する方法でロケールに依存します。

public static boolean containsIgnoreCase(String haystack, String needle) {
    return indexOfIgnoreCase(haystack, needle) >= 0;
}

public static int indexOfIgnoreCase(String haystack, String needle) {
    StringSearch stringSearch = new StringSearch(needle, haystack);
    stringSearch.getCollator().setStrength(Collator.PRIMARY);
    return stringSearch.first();
}
于 2014-05-27T14:29:18.177 に答える
3

文字列の大文字と小文字を区別しない一致を見つけるテストを行いました。私は 150,000 個のオブジェクトのベクターをすべて 1 つのフィールドとして文字列として持っており、文字列に一致するサブセットを見つけたいと考えていました。私は3つの方法を試しました:

  1. すべて小文字に変換

    for (SongInformation song: songs) {
        if (song.artist.toLowerCase().indexOf(pattern.toLowercase() > -1) {
                ...
        }
    }
    
  2. String matches() メソッドを使用する

    for (SongInformation song: songs) {
        if (song.artist.matches("(?i).*" + pattern + ".*")) {
        ...
        }
    }
    
  3. 正規表現を使用する

    Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher("");
    for (SongInformation song: songs) {
        m.reset(song.artist);
        if (m.find()) {
        ...
        }
    }
    

タイミング結果は次のとおりです。

  • 一致試行なし: 20 ミリ秒

  • 下位一致へ: 182 ミリ秒

  • 文字列一致: 278 ミリ秒

  • 正規表現: 65 ミリ秒

このユース ケースでは、正規表現が最速のようです。

于 2014-01-16T05:21:27.177 に答える
1

ここであなたの主な質問が何であるかはわかりませんが、はい、.contains は大文字と小文字を区別します。

于 2008-09-17T19:42:16.550 に答える
0
import java.text.Normalizer;

import org.apache.commons.lang3.StringUtils;

public class ContainsIgnoreCase {

    public static void main(String[] args) {

        String in = "   Annulée ";
        String key = "annulee";

        // 100% java
        if (Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "").toLowerCase().contains(key)) {
            System.out.println("OK");
        } else {
            System.out.println("KO");
        }

        // use commons.lang lib
        if (StringUtils.containsIgnoreCase(Normalizer.normalize(in, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""), key)) {
            System.out.println("OK");
        } else {
            System.out.println("KO");
        }

    }

}
于 2016-11-09T13:24:46.433 に答える
-1

次のようなことが簡単にできます。

String s1 = "AbBaCca";
String s2 = "bac";
String toLower = s1.toLowerCase();
return toLower.contains(s2);
于 2015-12-03T15:16:30.133 に答える
-1
String x="abCd";
System.out.println(Pattern.compile("c",Pattern.CASE_INSENSITIVE).matcher(x).find());
于 2010-12-09T11:24:13.947 に答える