2013-02-22 35 views
0

我正在嘗試創建一個檢查多個條件的常規(ruby)表達式。我使用這個正則表達式來替換我的對象的內容。我的正則表達式接近完成,除了我在減價方面面臨的兩個問題。正則表達式Markdown標頭

首先,標題給我帶來麻煩。例如,如果「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語法(在降級轉換器之前使用)。

+0

是有什麼在頭可言,你想改變什麼? – VladL 2013-02-22 13:50:35

+0

不,我只想用鏈接替換文字中的某些字詞。標題應保持不變。我嘗試添加(?<![^ ## + \ s])來跳過以「## +」開頭的行,但它不檢查字符組合。 – 2013-02-22 13:53:04

+0

您是否將此文檔渲染爲HTML - 如果是這樣,那麼如何在HTML上查找和替換?您可以輕鬆地在所有段落元素上運行它,這將排除標題。 – 2013-02-22 14:51:10

回答

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 
0

當他們做了一件清晰的事情時,正則表現效果最佳。如果你有多個條件,你的代碼通常應該將處理分成幾個步驟來反映。

在這種情況下,有兩個明顯的步驟:

  1. 使用簡單的正則表達式或其他邏輯來跳過該消息的報頭部分。
  2. 一旦你知道你在內容中,使用另一個正則表達式來處理內容。
+0

但是如果你有這樣的文本:同一個object.content內的「HEADER內容SUBHEADER內容」。理論上,標題可以在內容的任何地方出現。它們不一定處於不同的屬性,如object.title。 – 2013-02-22 14:26:32

+0

@PeterdeRidder,你仍然可以使用一個正則表達式來確定什麼不是頭,然後是另一個正則表達式來處理內容部分。如果您對實現該功能的具體細節有疑問,請使用更清晰的數據樣例更新您的問題,以及您正在使用的代碼示例。 – 2013-02-22 14:31:58

+0

我剛剛添加了一個代碼示例。 – 2013-02-22 14:47:05