使用Ruby的Downcase BBCode标记

时间:2013-12-26 13:33:03

标签: ruby

我试图隐藏一个BBCode标签大概的论坛。我需要编写一个解析器来封装我的标签,从[QUOTE]到[quote],从[/ QUOTE]到[/ quote]等等。

我写这个:

string.gsub(/#\[(.*?)\]/, ' \1'.downcase)

但当然它不起作用!

我该如何解决?

2 个答案:

答案 0 :(得分:3)

  • 您的#错了。
  • 您不需要使用捕获(通过放置())。你可以参考整场比赛。 []/将保持原样downcase,因此不包括它们。实际上,您的正则表达式可能已在捕获中包含/,因此从捕获中仅排除[]是没有意义的。
  • 您的'\1'.downcase无效,因为这相当于'\1'。要在匹配上执行方法,您需要一个块。
  • 我假设正则表达式中的.*?打算正确捕获嵌套括号,但这只有一半。如果您有"[foo [bar] baz]",然后按\[(.*?)\],则可以避免匹配"[foo [bar] baz]""[bar] baz]",但它仍会计算"[foo [bar]"。所以.*?没有意义。

考虑到上述几点,如果需要考虑嵌套括号,可以执行以下操作:

string.gsub(/\[[^\[\]]+\]/, &:downcase)

否则,

string.gsub(/\[.+\]/, &:downcase)

答案 1 :(得分:2)

您可以使用gsub的块版本修改匹配。

 s.gsub(/\[(.+?)\]/) { |match| match.downcase }

或更紧凑的版本

 s.gsub(/\[(.+?)\]/, &:downcase)

另请注意,有#阻止正则表达式匹配。

示例:

s = "from [QUOTE] to [quote], from [/QUOTE] to [/quote]"
s.gsub(/\[(.*?)\]/, &:downcase)
 => "from [quote] to [quote], from [/quote] to [/quote]"