0

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

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

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

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

或者:

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

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

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

我的第二个问题应该很容易,但不知何故我正在挣扎。如果单词是斜体“ 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 语法(在降价转换器之前使用)。

4

2 回答 2

0

正则表达式在做一件明确的事情时效果最好。如果您有多个条件,您的代码通常应该通过将处理分成多个步骤来反映这一点。

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

  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 回答