1

いくつかの正規表現を使用してオカレンスを見つけたいと思います。たとえば、ユーザーは次のように入力します。

word1 code1 -10001無し

つまり、word1 AND code1 AND-10001ANDを検索します。

これらの基準は、正規表現を作成するために使用されます。

私はそのようなテキスト行を持っています:

1-「私の通常のword12にはGCode10-10001が含まれています。レコードの終わり」//これはtrueであり、「world12にはGCode10-10001が含まれています」と返されます。

2-"これは他の行ですword12にはGCode10が含まれています-10001なしレコードの終わり"//これはfalseであり、何も返さないはずです

私はこれを試しました:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)((?!none).)*$

1行目で機能しますが、すべての行を返します

私もこれを試しました:

(\\w*word1\\w*).*(\\w*code1\\w*).*(\\w*-10001\\w*)(?!none)

しかし、それは私に「word12」、「GCode10」しか与えませんでした、しかしそれは「-10001」を逃しました、そしてさらに、それは2行目にマッチします!すべきではありません。

私は正規表現の専門家ではありません...

4

1 に答える 1

2

あなたはほとんどそこにいました.否定的な先読みを間違って使用しただけです:

^(?=.*?word1)(?=.*?code1)(?=.*?-10001)(?!.*?none).*$

また、各行を個別の文字列として扱っていない限り、複数行オプションを使用して正規表現をコンパイルする必要があります。したがって、subjectStringが複数行の文字列の場合、

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("^(?=.*?word1)(?=.*?code1)(?=.*?-10001)(?!.*?none).*$", Pattern.MULTILINE);
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 

基準を満たすすべての行のリストが表示されます。

Pattern.quote()ユーザー入力を処理している場合、ユーザーが提供するすべての文字列を呼び出したい場合があるため、正規表現のメタ文字はすべてエスケープされます。

于 2012-04-13T15:10:29.793 に答える