解析したい文字列があり、それは github マークダウンに少し似ていますが、完全な実装は本当に望んでいません。文字列は、「コード」ブロックと「テキスト」ブロックの混合になります。コード ブロックは、3 つのバッククォートの後にオプションの「言語」が続き、次にコードが続き、最後にさらに 3 つのバッククォートが続きます。非コードは、ほとんどすべてのものになります。ユーザーが「テキスト」ブロックに 3 つのバッククォートを入力できなくても、気にしません (気にする必要があるかもしれません)。ここに例があります...
これはコードブロックが続くテキストです ルビー デフ関数 "こんにちは" 終わり ``` もう少しテキスト
もちろん、さらに多くのコードとテキスト ブロックが散在している可能性があります。私はこれのための正規表現を書いてみましたが、うまくいくように見えましたが、すべての一致を与えるグループ (括弧内) を取得できず、scan() は順序を失いました。いくつかの Ruby パーサー (treetop、parselet) の使用を検討しましたが、私が望むものには少し大きく見えますが、それが私の最良の選択肢である場合は、喜んでそのルートに進みます。
考え?
何人かの人々が私が試していたREを求めてきました(以下の多くのバリエーション)...
re =
/
```\s*\w+\s* # 3 backticks followed by the language
(?!```).*? # The code everything that's not 3 backticks
``` # 3 more backticks
| # OR
(?!```).* # Some text that doesn't include 3 backticks
/x # Ignore white space in RE
たとえば単純なケースでも
md = /(a|b)*/.match("abaaabaa")
a と b のすべてを取得することはできません。存在しないmd [3]と言うから。それがより理にかなっていることを願っています。そのため、私の場合は RE が機能するとは思いませんが、間違っていることが証明されてもかまいません。