0

ネットワークデバイスから返された文字列を解析して、エラーがあるかどうかを確認しようとしています。

私が使用しているテストは、受け取った文字列に「invalid」という単語がない場合、エラーは発生しません。正規表現が正しいかどうかはわかりません。

Pattern noErrorsPattern = Pattern.compile("^(?!.*(invalid)).*$");   
Matcher noErrorMatcher = noErrorsPattern.matcher(receivedDataString);
if (!noErrorMatcher.matches()) {
    throw new Exception("input has error");
}

receiveDataStringには、文字列'invalid'が含まれていません。エディターに貼り付けて検索して確認しましたが、見つかりません。ただし、デバッガーをステップスルーすると、例外がスローされます。

-説明-問題の説明を簡略化しましたが、少し誤解を招いた可能性があります。詳細:コマンドごとに、返されたテキストからデータフィールドを抽出するための「FieldPattern」正規表現と、エラーが発生したかどうかを確認するための別の「NoError」正規表現があります。NoError正規表現は、「新しいエントリが追加されました」などのコマンドに対して正確に設定できるため、この文字列が見つかった場合、操作は成功しました。コマンドに何も指定されていない場合、文字列に「invalid」が出現しない正規表現は、デフォルトのNoErrorパターンです。

4

3 に答える 3

2

問題は、複数の行を一致させることです。デフォルトでは、Java の正規表現のドットは行末記号と一致しません。

したがって、Pattern.DOTALL正規表現をコンパイルするときに指定する必要があります。

注: 正規表現は既に固定されているため、 の.find()代わりに を使用できます.matches()

于 2013-01-07T16:12:30.630 に答える
1

あなたの論理は逆行しているようです。パターンが一致する場合、文字列「invalid」が含まれていますが、文字列が一致しない場合は例外がスローされます。(パターンを呼び出すだけでは、noErrorsPatternエラーのないパターンにはなりません:))

投稿した特定のケースでは、正規表現が複雑すぎるようです。どうですか:

Pattern errorsPattern = Pattern.compile("invalid");   
Matcher errorMatcher = errorsPattern.matcher(receivedDataString);
if (errorMatcher.find()) {
    throw new Exception("input has error");
}

これはと同等receivedDataString.contains("invalid")ですが、他の場合に必要であることを示す、より一般的な正規表現検索が可能になります。

于 2013-01-07T00:50:03.373 に答える
1

ここでは実際には正規表現は必要ありません。containsメソッドを使用できます。

if (receivedDataString.contains("invalid")) {
    throw new Exception("input has error");
}

とにかく正規表現が必要な場合は、を使用できます".*invalid.*"。コメントで述べたように、受信した文字列が複数行にまたがる場合は、必ずPattern.DOTALLフラグを有効にする、代わりに regex を使用して"(?s).*invalid.*"ください。

于 2013-01-07T00:31:53.250 に答える