0

OBD-II アダプターからデータを受け取り、それを正規表現で実行するコードがいくつかあるので、トラブル コードを含む部分を特定できます。これです。

dataRecieved = readMessage;
RX.setText(dataRecieved);

if((dataRecieved != null) && dataRecieved.matches("\\s*[A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2} [A-F0-9]{2}\\s*\r?\n?")) {
    if(D) Log.i(TAG, "REGEX ");

    dataRecieved = dataRecieved.replace(">", "").trim();
    DTC.setText(dataRecieved);

正規表現の後、受け取ったものをAndroidのTextViewに設定しました。ただし、実行するとテキストが設定されません。それが私が使用した正規表現かどうかはわかりません。次のようなものを検出するはずです

>
01 00 14 53 00 00

プロンプトを含めるか除外するか。

4

1 に答える 1

0

このmatches()メソッドは、正規表現が文字列全体を消費することを想定しているため、それ>がメッセージの一部である場合は、それを考慮する必要があります。

Pattern p = Pattern.compile(">\\s*((?:[A-F0-9]{2}\\s+){5}[A-F0-9]{2})\\s*");
Matcher m = p.matcher(dataRecieved);
if (m.matches())
{
  DTC.setText(m.group(1));
}

String のメソッドを使用する代わりに Matcher オブジェクトを作成することで、キャプチャ グループを使用してメッセージの関心のある部分を抽出することができ、 メソッドとメソッドmatches()が不要になりました。 replace()trim()

また、 は\s改行と改行に一致するため、\r?\n?は冗長でした。


編集:以下のコメントに従って、連続する行の 1 つ以上のトラブル コードに一致するバージョンを次に示します。

">\\s+((?:(?:[A-F0-9]{2}\\s+){5}[A-F0-9]{2}\\s*)+)"

すべての行が 1 つのブロックに取り込まれます。これにより、最後の行の末尾にある改行もキャプチャされるため、それを削除する必要がある場合があります。

于 2013-05-10T10:23:25.647 に答える