2

preg_grepを使用して作成したphpのコードを使用して、任意のコンテキストに存在する可能性のある任意の順序で複数の単語を照合します。私はそれをJavaに変換しようとしていますが、理解できないようです。

キーワードを正規表現文字列に変換するための私のphpコードは次のとおりです。

function createRegexSearch($keywords)
{
    $regex = '';
    foreach ($keywords as $key)
        $regex .= '(?=.*' . $key . ')';
    return '/^' . $regex . '/i';
}

/^(?=.*bot)/iのような正規表現文字列が作成されます。これはロボット、ロボット、ボットなどと一致するはずです。同じ正規表現文字列はJavaで機能しないようで、混乱を招きます。現在Javaで、containsを使用して同様の効果を作成しましたが、正規表現を使用したいと思います。

for (Map.Entry<String, String> entry : mKeyList.entrySet())
{
    boolean found = true;
    String val = entry.getValue().toLowerCase();
    for (int i = 0; i < keywords.length; i++)
    {
        if (!val.contains(keywords[i].toLowerCase()))
            found = false;
    }

    if (found)
        ret.add(entry.getValue());
}
4

4 に答える 4

1

Java が多くの言語と異なる点の 1 つは、ターゲットに対して正規表現を「照合」する 2 つの異なる方法があることです。「matches()」と「find()」^です$。式、 findは最初の一致を見つけfind() .*botます(文字列のどこにいても)-たとえば、ターゲット文字列でできるかもしれませんがrobots、それがmatches()ターゲットであると言うのは真実ではありません...私は完全ではありません先読みがこれにどのように影響するかを確認してください...

投稿された Java コード (問題を含む) がなければ、どこで問題が発生しているのかを特定するのは困難ですが、私の推測では、この領域に非常に簡単に当てはまる可能性があります。

/iまた、 Java (および .Net) で式の末尾に配置するのと同じことは、式(?i)の先頭 (または大文字と小文字を区別する領域) に配置することです。したがって/[a-f0-9]/i(?i)[a-f0-9]

于 2012-06-15T19:46:09.650 に答える
0

埋め込まれたフラグ拡張機能 (?i) を使用できるため、ボット、ロボット、ボット、およびロボットを照合するために使用する正規表現は次のとおりです(?i)^(.*bots?)$。これは、String.matches または Pattern/Matcher のいずれかで機能するはずです。

于 2012-06-15T20:08:18.753 に答える
0

文字列には大文字と小文字が区別されるため、最初のセット (PHP コード) は \i の使用により大文字と小文字を区別しないように動作します。ただし、Java コードは大文字と小文字を区別して動作します。したがって、動作に違いが生じます。

したがって、これが違いである場合は、contains チェックの前に toUpperCase() など、両方の末尾を特定の文字セットに変換します。

また、Java ではなく PHP コードで正規表現を使用していますが、この背後にある特定の理由はありますか?

よろしくアジャイG

于 2012-06-15T17:29:20.737 に答える