JavaのString.contains()メソッドで正規表現を使用する方法


112

文字列に「stores」、「store」、「product」という単語がこの順序で含まれているかどうかを確認します。

someString.contains(stores%store%product);も使ってみました.contains("stores%store%product");

正規表現を明示的に宣言してメソッドに渡す必要がありますか、それとも正規表現をまったく渡せませんか?

回答:


125

String.contains

String.contains文字列、ピリオドで動作します。正規表現では機能しません。指定された正確な文字列が現在の文字列に表示されるかどうかをチェックします。

String.containsは単語の境界をチェックしないことに注意してください。部分文字列をチェックするだけです。

正規表現ソリューション

正規表現はString.contains、キーワードに単語の境界を適用できるため(特に)、より強力です。つまり部分文字列だけでなく、単語としてキーワードを検索できます。

String.matches次の正規表現で使用します。

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"

RAW正規表現(文字列リテラルで行われたエスケープを削除します-これは、上記の文字列を印刷すると得られるものです):

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*

\bあなたがのために試合を得ることはありませんので、単語の境界をチェックし、restores store products。注stores 3store_productまた数字いるので、拒否され、_単語の一部とみなされているが、私はこの場合は自然テキストで表示されます疑います。

単語境界は両側でチェックされるため、上記の正規表現は正確な単語を検索します。つまり、なしstores stores productの単語storeを検索しているため、上記の正規表現に一致しませんs

.通常、改行文字を除く すべての文字に一致します。最初は例外なくすべての文字に一致します(これを指摘してくれたTim Pietzckerに感謝します)。(?s).


7
(?s)文字列に改行が含まれている場合は、正規表現の先頭に追加することをお勧めします。
Tim Pietzcker 2013

私はこのような>> URLでそれをチェックしていますstores.nextag.com/store/4908844/product/1070625777/...
vipin8169

あなたはここで最初のバックスラッシュを説明することができます\\b
vipin8169

1
@ vipin8169:Stringでは\、1つを指定するためにを2倍にする必要がある\ため、RAW正規表現で見られる\\bように\b、として解釈されます。\b上記で説明したように、単語の境界に一致します。
nhahtdh 2013

「.mydomain」と一致させる必要がある場合。文字列で。それからそれはどのように正規表現を更新しますか?私の使用例は、「www.abc.mydomain.in.io」に.mydomainが含まれているかどうかです。か否か
Manmohan Soni

111

matcher.find()必要なことを行います。例:

Pattern.compile("stores.*store.*product").matcher(someString).find();

4
これが大好きです。マッチャーの正規表現が複雑すぎると思います。
Mathter 2016

21

matchesStringクラスのメソッドを使うだけです。

boolean result = someString.matches("stores.*store.*product.*");

14
で始まる必要があり.*ます。そうしないと、で始まる文字列のみに一致しますstores
shmosel

領域全体をパターンと照合しようとします。@shmoselは正しいようですよね?
Pieter De Bie 2017

1
まあ、それは一致するだけですが、文字列が任意の位置にパターンを含んでいるかどうかはチェックしません。これはOPが求める解決策ではありません。正規表現を改良することをお勧めします。
Gee Bee

2

文字列に部分文字列が含まれているかどうか、または正規表現を使用していないかどうかを確認する場合は、find()を使用して最も近い方法を実行できます-

    private static final validPattern =   "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
    Pattern pattern = Pattern.compile(validPattern);
    Matcher matcher = pattern.matcher(inputString);
    System.out.print(matcher.find()); // should print true or false.

match()とfind()の違いに注意してください。matches()は、文字列全体が指定されたパターンに一致する場合にtrueを返します。find()は、指定された入力文字列のパターンに一致する部分文字列を見つけようとします。また、find()を使用することで、正規表現パターンの最初と最後に-(?s)。*と。*のような余分なマッチングを追加する必要はありません。


2
public static void main(String[] args) {
    String test = "something hear - to - find some to or tows";
    System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
    System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
    if(fromIndex != null && fromIndex < text.length())
        return Pattern.compile(pattern).matcher(text).find();

    return Pattern.compile(pattern).matcher(text).find();
}

1.result:true

2.result:true


fromIndex無視されませんか?contains("something", test, 5) => true
PKeidel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.