正则表达式Markdown标题

时间:2013-02-22 13:44:49

标签: ruby regex markdown

我正在尝试创建一个检查多个条件的常规(ruby)表达式。我使用这个正则表达式来替换我的对象的内容。我的正则表达式接近完成,除了我在降价方面面临的两个问题。

首先,标题给我带来了麻烦。例如,如果“Hi”在标题中,我不想将“Hi”替换为“Hello”。

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

文字:嗨,你好吗? &lt; ==#应该是:你好,你好吗?替换后

或者:

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

文字:嗨,你好吗? &lt; ==#应该是:你好,你好吗?替换后

问题:如何在正则表达式中转义markdown标头?我尝试过负面的后视和前瞻性断言,但无济于事。

我的第二个问题应该很简单,但不知怎的,我正在努力。如果单词是Italic“ hi ”,我想找到并替换它们,而不更改下划线。我可以用这个正则表达式找到这个词:

\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 
==============
  

Iphone5是最好的手机,尽管三星的人可能会想,或者只是希望他们的三星Galaxy S3更好。

#### Samsung Galaxy S3?
  

是的,这是最新款三星手机的名称。

这将生成带有HTML标签的文本,但是当我使用我的正则表达式时,我的内容使用Markdown语法(在降价转换器之前使用)。

2 个答案:

答案 0 :(得分:0)

当他们做一件清楚的事情时,正则数据最有效。如果您有多个条件,那么您的代码通常应该通过将处理划分为多个步骤来反映这一点。

在这种情况下,您有两个明确的步骤:

  1. 使用简单的正则表达式或其他逻辑来跳过邮件的标题部分。
  2. 一旦您知道自己在内容中,请使用其他正则表达式来处理内容。

答案 1 :(得分: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