0

コード チャンク (文字列) を「主要部分」と「期待される戻り部分」に分離する最良の方法は何ですか? ここに私の定義があります:

  • 予期される戻り部分は、一致する行の後に、一致しないが一致/^[ \t]*#[ \t]*=>/する 0 個以上の連続する行が続くことです。/^[ \t]*#[ \t]*=>//[ \t]*#(?!\{)/
  • 主要部分は、予期される戻り部分ではない連続した行です。

主要部分と期待される戻り部分は、コード チャンク内で複数回出現する場合があります。

コードチャンクの文字列が与えられた場合、それぞれが期待される戻り部分であるかどうかのフラグと文字列を含む配列の配列を取得したいと考えています。これを行う最善の方法は何ですか?たとえば、code内容が次のような文字列があるとします。

def foo bar
  "hello" if bar
end
#=> foo(true) == "hello"
#=> foo(false) == nil
a = (0..3).to_a
#=> a == [
#          0,
#          1,
#          2,
#          3
#   ]

これと同等のリターンが欲しい:

[[false, <<CHUNK1], [true <<CHUNK2], [true, <<CHUNK3], [false, <<CHUNK4], [true, <<CHUNK5]]
def foo bar
  "hello" if bar
end
CHUNK1
#=> foo(true) == "hello"
CHUNK2
#=> foo(false) == nil
CHUNK3
a = (0..3).to_a
CHUNK4
#=> a == [
#          0,
#          1,
#          2,
#          3
#   ]
CHUNK5
4

1 に答える 1

1

この正規表現は、予想されるすべての戻り値と一致する必要があります。

^([ \t]*#[ \t]*=>.+(?:\n[ \t]*#(?![ \t]*=>).+)*)

文字列から予想されるすべての戻り値を抽出して、区切り記号で置き換えます。次に、文字列をセパレーターで分割すると、すべての主要部分が得られます。

ここでテストしてください: http://rubular.com/r/ZYjqPQND28

正規表現に関するあなたの定義にはわずかな問題があり/[ \t]*#(?!>\{)/ます/[ \t]*#(?!=>)/

#=> foo(true) == "hello"
#=> foo(false) == nil

1つのチャンクとしてカウントされます

別のアプローチは、この正規表現を使用することです(完全に最適化されていません):

^([ \t]*#[ \t]*=>.+(?:\n[ \t]*#(?![ \t]*=>).+)*|(?:[ \t]*(?!#[ \t]*=>).+\n)*)

単に正しくチャンクに分割し、各チャンクに対して比較的単純な正規表現テストを実行して、それが予想されるリターンまたは主要部分であるかどうかを確認します。

于 2012-10-28T08:31:09.517 に答える