2017-09-11 10 views
3

私はGOTOs/GOSUBs行番号をBASICコードから抽出しようとしています。私はNodeJSを使ってマッチを管理しようとしています(JS風のRegexです)。Regexを使ってGOTO/GOSUBの行番号を抽出する

私はregex101.comを使用してテストをやっている(ここではhttps://regex101.com/r/SaZuue/2を参照)、私は私が望むものにかなり近いよ:

  • エキスGOTO ###GOSUB ###エキス
  • ["GOSUB", " ", "###"]として抽出
  • ["GOTO", " ", "###"]などをIF (cond) THEN ###として["THEN", " ", "###"]
  • ON ERR GOTO #, ##, ###として["GOTO", " ", "#", ", ", "##", ", ", "###"]
  • GOSUBTHEN,間のスペースはオプションであるか、または複数とすることができ、すべての場合に示されるスペースの正確な数を返すという事実と ON ERR GOSUB
  • 取引以外は上記と同じ
  • 。すべてのマッチンググループは返しON ERR GOTOを除きOKです

    100 ON ERR GOTO 10000, 30, 200, 10,800: GOSUB 20: IF A THEN 10: GOTO30: GOTO 50

    :上

    /(GOTO|GOSUB|THEN)(\s*)(\d+)(?:(\s*,\s*)(\d+))*/ig

    テスト:

は、これまでのところ私は、次の正規表現が出ています最初と最後の数字のみ(10000 & 800)で、他の数字は含まれません。

私には何が欠けていますか?ありがとう:)

+2

JSの正規表現は、最後の値だけが保持され、繰り返しのキャプチャをサポートしていません。だから、最良のアプローチは[すべての数字を取り込む](https://regex101.com/r/dPDLqD/1)で、グループ4を '/ \ s *、\ s * /' regex(必要に応じて空の値を除外します)。純粋な正規表現の解決法はここでは不可能です。 –

+0

Argh!やみつめ!とにかくありがとう ! – fvlinden

+0

BASICのいくつかのフレーバは変数に行番号を入れることができます: 'A $ = 10:GOTO A $' –

答えて

3

正規表現に任意の数のキャプチャを持たせる方法はなく、各グループのキャプチャ値スタックを格納しないため、JS RegExpを使用して1つのグループ内の複数のキャプチャにアクセスする方法はありません(後続のキャプチャは既存のキャプチャを再書き込みするため、グループごとに最後のキャプチャのみが保存されます)。

カンマで区切られた数字のスジをキャプチャし、分割して別々に取得します。例えば。あなたのパターンの最後を((?:\s*,\s*\d+)*)のようにします(0+のシーケンスと0+の空白で囲まれた1つ以上の数字で囲まれた,に一致させます)。その後、一致すると/\s*,\s*/とフィルターで分割されます。

JSのデモを参照してください:

var rx = /\b(GO(?:TO|SUB)|THEN)(\s*)(\d+)((?:\s*,\s*\d+)*)/gi; 
 
var str = "100 ON ERR GOTO 10000, 30, 200, 10,800: GOSUB 20: IF A THEN 10: GOTO30: GOTO 50"; 
 
var m; 
 
while ((m = rx.exec(str)) !== null) { 
 
    console.log([m[1], m[2], m[3], m[4].split(/\s*,\s*/).filter(Boolean)]); 
 
}

+0

OKコードのおかげで、これは正しい方向に私を導いています。グループ4に複数のカンマがあるかどうかを検出し、それを削除して元の結果に '(\ s *、\ s *)(\ d *)'のような別の正規表現の結果を追加するだけです – fvlinden

関連する問題