0

そのため、特定のスニペットのテキストファイルをフィルタリングする正規表現を作成しようとしています(ブルートフォースではなく速度を探しています)。

各試合から3つのものを取得したい:

  • スニペットを識別するためのキー
  • 各スニペットをフォーマットするためのオプションの言語
  • 開始タグと終了タグの間のすべての行を表す

これは正規表現です(失敗したテストハーネスはここにあります-https ://gist.github.com/shiftkey/5236161 ):

(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*[\n](?<value>.*?)[\n].*end code (?<key>[A-Za-z-]*)

これらのオプションの使用:RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline

したがって、次のようなファイル:

// code start foo csharp
var x = 1;
// end code foo 

期待値を教えてください:

  • キー:foo
  • 言語:csharp
  • var x = 1;

しかし、2番目の行を持つスニペットを導入すると、最後の行しか取得できません。

// code start foo csharp
var x = 1;
var y = 2;
// end code foo 
  • キー:foo
  • 言語:csharp
  • var y = 2;

それ以外の

  • :(var x = 1;\r\nvar y = 2;または同様の)

グループに複数の行をカバーさせることで何を見逃しましたか?

SOで発生した同様のシナリオを見てきましたが、それらは私の使用法では機能しませんでした。

4

2 に答える 2

1

これは、2つ.*の欲望を変更することで回避できます。

(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*?[\n](?<value>.*)[\n].*?end code (?<key>[A-Za-z-]*)

.*スニペット値として最初の改行の後のコンテンツが必要なため、言語を読んだ後はそれほど貪欲ではないはずです。ただし、.*forの解析valueは、最初のパターンに遭遇したときに停止することは想定されていないため、より貪欲になる可能性があり\nます。したがって、上記のパターンです。

于 2013-03-25T10:41:06.157 に答える
0

あなたが望むなら、あなたはいくつかの見回しのものでもキャッチをすることができます...

(?<=code\sstart\s)(?<key>\b\w+\b)\s(?<language>\b\w+\b).*\r\n(?<content>(?s).*)(?=\r\n.*end\scode\s\1\s-->)
于 2013-03-25T11:12:56.290 に答える