4

"#SP"Javaで単語(引用符なし、大文字と小文字を区別しない)を含む文字列を照合しようとしています。ただし、正規表現の使用は非常に難しいと感じています。

一致させる必要のある文字列 : "This is a sample #sp string"、、 "#SP string text...""String text #Sp"

一致させたくない文字列: "Anything with #Spider""#Spin #Spoon #SPORK"

これが私がこれまでに持っているものです:http://ideone.com/B7hHkR。誰かが私の正規表現を構築することを通して私を導くことができますか?

私も試しました:"\\w*\\s*#sp\\w*\\s*"役に立たない。

編集:IDEoneのコードは次のとおりです。

java.util.regex.Pattern p = 
    java.util.regex.Pattern.compile("\\b#SP\\b", 
        java.util.regex.Pattern.CASE_INSENSITIVE);

java.util.regex.Matcher m = p.matcher("s #SP s");

if (m.find()) {
    System.out.println("Match!");
}
4

3 に答える 3

5

(編集: 肯定的な後読みは必要ありません。マッチングのみが行われ、置換は行われません)

あなたは、Java の誤った名前の正規表現マッチング メソッドのもう 1 つの犠牲者です。

.matches()非常に残念なことに、入力全体に一致させようとしますが、これは「正規表現一致」の定義に明らかに違反しています (正規表現は入力のどこにでも一致できます)。使用する必要があるメソッドは.find().

これはブレインデッド API であり、残念ながら、このような誤ったメソッド名を持つ言語は Java だけではありません。Pythonも有罪を認めています。

また、\\b単語の境界で検出され#、単語の一部ではないという問題があります。入力の開始またはスペースのいずれかを検出する代替を使用する必要があります。

コードは次のようにする必要があります (完全修飾されていないクラス)。

Pattern p = Pattern.compile("(^|\\s)#SP\\b", Pattern.CASE_INSENSITIVE);

Matcher m = p.matcher("s #SP s");

if (m.find()) {
    System.out.println("Match!");
}
于 2012-12-20T22:59:51.540 に答える
4

うまくやっていますが、# の前の \b は誤解を招きます。\b は単語境界ですが、# は既に単語文字ではありません (つまり、セット [0-9A-Za-z_] にはありません)。したがって、# の前のスペースは単語境界とは見なされません。への変更:

java.util.regex.Pattern p = 
    java.util.regex.Pattern.compile("(^|\\s)#SP\\b", 
        java.util.regex.Pattern.CASE_INSENSITIVE);

(^|\s) は、^ または \s のいずれかに一致することを意味します。ここで、^ は文字列の先頭 (例: "#SP String") を意味し、\s は空白文字を意味します。

于 2012-12-20T23:17:42.500 に答える
1

正規表現"\\w*\\s*#sp\\w*\s*"は、0 個以上の単語、0 個以上のスペース、#sp、0 個以上の単語、0 個以上のスペースの順に一致します。私の提案は、\s* を使用して式を分割するのではなく、代わりに \b を使用することです。

"(^|\b)#sp(\b|$)"
于 2012-12-20T22:59:49.430 に答える