1

いくつかのテキストに対してパターンをチェックする必要があります (パターンが多くのテキスト内にあるかどうかをチェックする必要があります)。

これは私の例です

String pattern = "^[a-zA-Z ]*toto win(\\W)*[a-zA-Z ]*$";    
if("toto win because of".matches(pattern))
 System.out.println("we have a winner");
else
 System.out.println("we DON'T have a winner");

私のテストでは、パターンが一致する必要がありますが、正規表現を使用すると一致しません。一致している必要があります :

" toto win bla bla"

"toto win because of"
"toto win. bla bla"


"here. toto win. bla bla"
"here? toto win. bla bla"

"here %dfddfd . toto win. bla bla"

一致してはなりません:

" -toto win bla bla"
" pretoto win bla bla"

正規表現を使用して実行しようとしましたが、機能しません。

私が間違っていることを指摘できますか?

4

5 に答える 5

1

これはうまくいくでしょう

(?im)^[?.\s%a-z]*?\btoto win\b.+$

説明

"(?im)" +         // Match the remainder of the regex with the options: case insensitive (i); ^ and $ match at line breaks (m)
"^" +             // Assert position at the beginning of a line (at beginning of the string or after a line break character)
"[?.\\s%a-z]" +    // Match a single character present in the list below
                     // One of the characters “?.”
                     // A whitespace character (spaces, tabs, and line breaks)
                     // The character “%”
                     // A character in the range between “a” and “z”
   "*?" +            // Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
"\\b" +            // Assert position at a word boundary
"toto\\ win" +     // Match the characters “toto win” literally
"\\b" +            // Assert position at a word boundary
"." +             // Match any single character that is not a line break character
   "+" +             // Between one and unlimited times, as many times as possible, giving back as needed (greedy)
"$"               // Assert position at the end of a line (at the end of the string or before a line break character)

更新 1

(?im)^[?~`'!@#$%^&*+.\s%a-z]*? toto win\b.*$

更新 2

(?im)^[^-]*?\btoto win\b.*$

更新 3

(?im)^.*?(?<!-)toto win\b.*$

説明

"(?im)" +       // Match the remainder of the regex with the options: case insensitive (i); ^ and $ match at line breaks (m)
"^" +           // Assert position at the beginning of a line (at beginning of the string or after a line break character)
"." +           // Match any single character that is not a line break character
   "*?" +          // Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
"(?<!" +        // Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind)
   "-" +           // Match the character “-” literally
")" +
"toto\\ win" +   // Match the characters “toto win” literally
"\\b" +          // Assert position at a word boundary
"." +           // Match any single character that is not a line break character
   "*" +           // Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
"$"             // Assert position at the end of a line (at the end of the string or before a line break character)

コード内で使用するには、正規表現をエスケープする必要があります

于 2012-06-12T09:44:48.137 に答える
1

コードを次のように変更するだけですString pattern = "\\s*toto win[\\w\\s]*";

\W は無単語文字を意味し、\w は単語文字 (a-zA-Z_0-9) を意味します。

[\\w\\s]*"toto win" の後の任意の数の単語とスペースに一致します。

アップデート

新しい要件を反映するには、次の式が機能します。

"((.*\\s)+|^)toto win[\\w\\s\\p{Punct}]*"

((.*\\s)+|^)は、少なくとも 1 つのスペースが後に続くもの、または行頭のいずれかに一致します。

[\\w\\s\\p{Punct}]*単語、数字、スペース、句読点の任意の組み合わせに一致します。

于 2012-06-12T09:07:44.847 に答える
0

winパターンの と次の単語の間にスペースがありません

これを試して:\\stoto\\swin\\s\\w

http://gskinner.com/RegExr/ここで正規表現を試すことができます

于 2012-06-12T08:58:11.017 に答える