1

いくつかのブログ投稿を移行するためのスクリプトを書いています。

各ブログ投稿には、マークダウンでインデントされたコードサンプルが含まれている場合があります。そのうちのいくつかは、3つのコロンと言語識別子で始まる最初の行を持っています。

    ::: ruby
    def test
      puts "meh"
    end

これらは、より大きなテキストの一部です。

さて、与えられたテキストについて、これらのコードブロックを見つけて、これに置き換えたいと思います。

{% codeblock lang:ruby %}
def test
  puts "meh"
end
{% endcodeblock %}

コロンまたは言語識別子が3つない場合は、lang:<lang>ビットを省略します。

私は現在、これらを見つけるための正規表現の書き方に困惑しています。私が思いつくことができるのは、この厳粛で働いていない獣だけです:

/^\s{4}(:::(\w+))+\n(\s{4}.*)\n^\s{0}$/mi

詳細については、 http://www.rubular.com/r/kycM8SDQLbを参照してください。

各投稿を更新する適切な方法は何でしょうか?私は正規表現に取り組んでいるだけで、ルビーコードは問題になりません。

ありがとう。

4

3 に答える 3

0

そのコードをテキストに解析していると仮定して、これを試してください:

str = %Q{:::ruby
def test
  puts "meh"
end}

str2 = %Q{def test
  puts "meh"
end}

str.gsub(/^\s*(:::\s(\w+))?((.|\s)+)/) do
  "{% codeblock#{" lang:#{$1}" if $1} %}#{$3}{% endcodeblock %}"
end
str2.gsub(/^\s*(:::\s(\w+))?((.|\s)+)/) do
  "{% codeblock#{" lang:#{$1}" if $1} %}#{$3}{% endcodeblock %}"
end

適応できるのは、言語名の正規表現(おそらくc ++をキャッチしない)と先頭/末尾の空白文字です。それ以外は、これでうまくいくと思います

于 2012-10-11T10:48:59.973 に答える
0

オプションを使用しているのは良いことですが、正規表現にアルファベットがないmため、オプションを使用しても意味がありません。i一致後に言語名を大文字または小文字にすることもできます。\s改行が含まれていることに注意してください。

/^ {4}:::[ \t]*(\w+)[ \t]*\n((?: {4}[^\n]*\n)*)/m

または、Linux 以外を使用している可能性がある場合は、

/^ {4}:::[ \t]*(\w+)[ \t]*#{$/}((?: {4}[^#{$/}]*#{$/})*)/m
于 2012-10-11T10:14:21.700 に答える
0

アップデート:

OK、改行の問題は Opera ブラウザに起因することが判明しました。

クロムで元のリンクを確認すると、機能しているように見えますが、一致しすぎています。

したがって、唯一の問題は、正規表現を非貪欲にすることです。

^\s{4}(:::(\w+))+\n(\s{4}.*?)\n^$

Rubularのこちらをご覧ください

元の回答:

正規表現を次のように変更すると

^\s{4}:::(\w+)\r\n( {4}.*?)^\r$

それはうまくいきます、ルビュラーでそれを見てください

正規表現に(少なくともRubularでは)3つの問題があるようです:

  1. 改行があり\r\nますので、あなたの\n単独では一致しません。

  2. $改行には実際には一致しません。 の前に一致する\nため、改行が\r\n

  3. {0} は役に立ちません。実際、ルビュラーをどこかに置くと、何も一致しなくなります。

そして、私.*は貪欲でないバージョンに変更しました.*?。そうしないと、一致しすぎます。

于 2012-10-11T10:09:48.317 に答える