1

StringTCP/IPソケットを介して入ってくる示されている打撃の正規表現を作成しようとしています。

$AVSYS,99999999,V1.17,SN0000103,32768*16

$ 各文字列は、5〜6桁のドル記号と大文字の英字で始まる必要があります。それらは*、2桁の英数字のチェックサムで終わります。各フィールドはコンマで区切られ,、任意の文字列にすることができます。

そのための正規表現を作成しました。

^\$[A-Z]{5,6}(\,.*)(\,.*)(\,.*)(\,.*)(\,.*)\*[\d\w]{2}$

一致すると思っていましたが、一致しませんでした。Java docを読んだのに、まだ正規表現に慣れていません。正しい正規表現を取得するために私を助けてください。

編集済み

返信に従って正規表現を修正した後、これら2つを試しました。

^\$[A-Z]{5,6}(\,.*)(\,.*)(\,.*)(\,.*)(\,.*)\*[\d\w]{2}$
^\$[A-Z]{5,6}(\,.*?)(\,.*?)(\,.*?)(\,.*?)\*[\d\w]{2}$

しかし、予想以上の結果が得られました。

$AVSYS,99999999,V1.17,SN0000103,32768*16
$AVRMC,80000551,144811,A,4351.3789,N,07923.4712,W,0.00,153.45,091107,A,,161,1*64
$AVRMC,80000551,144811,A,4351.3789,N,07923.4712,W,0.00,153.45,091107,A,,161,1,0,0*64
$EAVSYS,99999999,12345678901234567890,9057621228,,,*0B

上記の文はすべて正規表現と一致しますが、1)だけを取得したいと思います。どうすればこれを達成できますか?

4

3 に答える 3

1

コンマで区切られた任意の数のグループに一致させるには、次の式を使用できます。

^\$[A-Z]{5,6}(,[^,*]*)*\*[\da-zA-Z]{2}$

データ部分は、次の式で照合されます。

(,[^,*]*)*

コンマで始まり、その後にコンマまたはアスタリスク以外の任意の数の文字が続く 0 個以上の文字グループに一致します。カンマまたはアスタリスクに達すると、式エンジンはそれが新しい値であるか最後のチェックサムであるかをチェックします。

チェックサムで小文字が許可されていない場合は、 に置き換えa-zA-ZますA-Z

于 2013-03-02T08:21:37.547 に答える
1

正規表現には追加のサブグループがあります。これはうまくいくはずです:

^\$[A-Z]{5,6}(\,.*)(\,.*)(\,.*)(\,.*)\*[\d\w]{2}$

補足として、これも機能するはずですが、多くのバックトラッキングがなくなるため、効率が向上します。「?」added は、貪欲でない方法で正規表現を一致させます。

^\$[A-Z]{5,6}(\,.*?)(\,.*?)(\,.*?)(\,.*?)\*[\d\w]{2}$

新しい編集に関しては、次を使用できます。

^\$[A-Z]{5,6}(\,[^\,]+?)(\,[^\,]+?)(\,[^\,]+?)(\,[^\,]+?)\*[\d\w]{2}$

つまり、

  1. 「.」を置き換えます。'[^\,]' を使用すると、任意の文字だけではなく、コンマを除く任意の文字に一致します。と
  2. 長さがゼロの一致を避けるために、「*」を「+」に置き換えます。
于 2013-03-02T08:45:14.580 に答える
0

空のグループを避けるには、次のように置き換え*ます+

^\$[A-Z]{5,6}(,.+?)(,.+?)(,.+?)(,.+?)\*\w{2}$

カンマをエスケープする必要はなく、インクルードします\w\d実際、これは次のようになります。[a-zA-Z0-9_]

于 2013-03-02T12:31:09.800 に答える