0

二重除外ファイル用のレンズを書きたい。例:

+ /etc
- /

したがって、私のレンズは次のようになります。

module DuplyExclude =
  let nl = del /[\n]+/ "\n"
  let entry = [ label "entry" . [ label "op" . store /(\+|-)/ ] . del /[ \t]+/ " " . [ label "path" . store /\/[^ \t\n\r]+/ ] ]
  let lns = ( entry . nl )*

  test lns get "+ /hello\n+ /etc\n- /" = ?

これにより、エラーが発生します。少し実験してみると、正規表現/(\+|-)/が 2 行目に一致しないことがわかりました。問題は次のとおりです: でエスケープされたとしても、ダッシュが一致しないように見えるのはなぜ\ですか?

4

1 に答える 1

1

これには 2 つの理由があります。

  1. テスト文字列に末尾の がありません\nlnsエントリの後に無条件の改行が続くと定義されているため、これは重要です。これは augparse を使用した文字列テストにのみ実際に影響することに注意してください。これは、ライブラリを介してファイルをロードするときに、読み込まれたファイルに末尾の \n が追加されるためです (多くのレンズでは EOL の欠落を処理できないため)。
  2. パス ノードは、 1 つの文字の/後に少なくとも 1 つの ( +) 文字が続く と一致するものとして定義されstore /\/[^ \t\n\r]+/ます。これは単一の/エントリと一致しません。

したがって、これら 2 つの変更により、このレンズは次のように機能します。

モジュール DuplyExclude =
  let nl = del /[\n]+/ "\n"
  let entry = [ label "entry" . [ラベル「op」。/(\+|-)/ ] を格納します。デル /[ \t]+/ " " . [ラベル「パス」。ストア /\/[^ \t\n\r]*/ ] ]
  let lns = ( entry . nl )*

  test lns get "+ /hello\n+ /etc\n- /\n" = ?
テスト結果: /tmp/duplyexclude.aug:6.2-.44:
  {「エントリー」
    { "op" = "+" }
    { "パス" = "/こんにちは" }
  }
  {「エントリー」
    { "op" = "+" }
    { "パス" = "/etc" }
  }
  {「エントリー」
    { "op" = "-" }
    { "パス" = "/" }
  }
于 2015-12-10T11:12:31.230 に答える