0

複数の条件をチェックする通常の(ruby)式を作成しようとしています。この正規表現を使用して、オブジェクトのコンテンツを置き換えます。マークダウンに関して直面している2つの問題を除いて、私の正規表現はほぼ完成に近づいています。

まず、ヘッダーが問題を引き起こしています。たとえば、ヘッダーに「Hi」が含まれている場合、「Hello」を「Hi」に置き換えたくありません。

Hi John <== # should not change
==================

テキスト:こんにちは、お元気ですか?<==#あるべき:こんにちは、お元気ですか?置換後

または:

#### Hi Peter <== # should not change

テキスト:こんにちは、お元気ですか?<==#あるべき:こんにちは、お元気ですか?置換後

質問:正規表現内のマークダウンヘッダーをエスケープするにはどうすればよいですか?ネガティブな後読みと先読みのアサーションを試しましたが、役に立ちませんでした。

私の2番目の問題は非常に簡単なはずですが、どういうわけか私は苦労しています。単語が斜体の場合「こんにちは」アンダースコアを変更せずに、単語を見つけて置き換えたいと思います。私はこの正規表現で単語を見つけることができます:

\b[_]*hi[_]*\b

質問2:しかし、それを置き換える場合は、下線も変更します。単語の境界を使用しながら、単語自体を検出して置き換える方法はありますか?

コード例

@website.autolinks.all.each do |autolink|
  autolink.name #for example returns "Iphone5"
  autolink.url  #for example returns "http://www.apple.com"

  regex = /\b(?<!##\s)(?<![\d.\[])([_]*)#{autolink.name}([_]*)(?![\d'"<\/a>])\b/

  if @permalink.blog_entry.content.match(regex)
    @permalink.blog_entry.content.gsub!(regex, "[#{autolink.name}](#  {autolink.url})")  
  end
end

テキストの例

Iphone5 
==============

サムスンの人々はおそらくサムスンギャラクシーS3がより良いと思っているか、おそらくそれを望んでいるにもかかわらず、iPhone5は最高の携帯電話です。

#### Samsung Galaxy S3?

はい、それは最新のサムスンの携帯電話の名前です。

これにより、HTMLタグ付きのテキストが作成されますが、正規表現を使用する場合、コンテンツはMarkdown構文(マークダウンコンバーターの前に使用)を使用します。

4

2 に答える 2

0

正規表現は、明確なことを1つ実行するときに最も効果的に機能します。複数の条件がある場合、コードは通常、処理をステップに分割することによってそれを反映する必要があります。

この場合、2つの明確なステップがあります。

  1. 単純な正規表現または他のロジックを使用して、メッセージのヘッダー部分をスキップします。
  2. コンテンツに参加していることがわかったら、別の正規表現を使用してコンテンツを処理します。
于 2013-02-22T14:17:43.437 に答える
0

私は解決策を見つけました:

regex = /(?<!##\s)(?<![\d.\[a-z])#{autolink.name}(?![\d'"a-z<\/a>])(?!.*\n(==|--))/i

    if @permalink.blog_entry.content.match(regex) 
      @permalink.blog_entry.content.gsub!(regex, "[\\0](#{autolink.url})")
    end
于 2013-02-22T14:18:06.240 に答える