带有 Ruby 的 BBCode 标签



我试图掩盖BBCode标签大写的论坛。我需要编写一个解析器来缩小我的标签,从 [QUOTE] 到 [quote],从 [/QUOTE] 到 [/quote] 等。

我写这个:

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

但当然行不通!

我该如何解决它?

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

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

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

否则

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

您可以使用 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]" 

最新更新