2012-01-14 60 views
1

作爲我寫作的一個聊天應用程序的一部分,我需要使用正則表達式來匹配聊天消息中的星號和下劃線,並將它們轉換爲<strong><em>標記。由於我用正則表達式很糟糕,所以我很困難。理想情況下,我們可以這樣設置:Ruby的正則表達式的星號/下劃線強/ em?

  • 一到三個單詞,但不是更多,可以標記爲strong/em。
  • 諸如「un * believ * able」之類的模式將被匹配。
  • 只有一個或另一個(強或OR)在一行內工作。

上面的參數是按重要性排列的,只有#1是完全必要的 - 其他的只是可愛。最接近我工作的東西是:

text = text.sub(/\*([(0-9a-zA-Z).*])\*/,'<b>\1<\/b>') 
text = text.sub(/_([(0-9a-zA-Z).*])_/,'<i>\1<\/i>') 

但它顯然不適用於我們的任何參數。

奇怪的是,沒有一個類似的東西已經在那裏,因爲使用星號的大膽和whatnot的流行。如果有的話,我無法在插件/寶石之外找到它(這不適用於這個實例,因爲我真的只需要它在我的模型中的一個地方)。任何幫助,將不勝感激。

+0

在我看來,你應該使用降價寶石。 – pguardiario 2012-01-14 11:32:09

+0

我的印象是,那些不適合實施,因爲它只是在聊天,而不是論壇或CMS。是否有指定降價的哪些部分適用於這些選項? – Megs 2012-01-14 23:25:01

回答

1

這會幫助你完成你正在做的事情:

sub(/\*(.*)\*/,'<b>\1</b>') 
sub(/_(.*)_/,'<i>\1</i>') 
+1

你會希望使用至少一個非貪婪的量詞('。+?')而不是'。*',因爲後者將匹配「* un * believ *」in「so * un * believ *能夠」。另外gsub()代替sub()來格式* more *而不是_one_加重標籤。 – sunaku 2012-01-14 07:34:51

+0

當'\ 1'結尾包含&符時會發生什麼? – 2012-01-17 05:04:28

0

首先,你的標準是有些奇怪,但是,沒關係......

看來,一個可能的算法,這將是找到消息中匹配的數量,計算它們以查看是否少於4,然後嘗試執行一組替換。

strong_regexp = /\*([^\*]*)\*/ 
em_regexp = /_([^_]*)_/ 

def process(input) 
    if input ~= strong_regexp && input.match(strong_regexp).size < 4 
    input.sub strong_regexp, "<b>\1<\b>" 
    elsif input ~= em_regexp && intput.match(em_regexp).size < 4 
    input.sub em_regexp, "<i>\1<\i>" 
    end 
end 

您的規格不完全清楚,但如果您瞭解這一點,則可以自行調整。

相關問題