2012-01-14 217 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 

您的规格不完全清楚,但如果您了解这一点,则可以自行调整。

相关问题