我试图隐藏一个BBCode标签大概的论坛。我需要编写一个解析器来封装我的标签,从[QUOTE]到[quote],从[/ QUOTE]到[/ quote]等等。
我写这个:
string.gsub(/#\[(.*?)\]/, ' \1'.downcase)
但当然它不起作用!
我该如何解决?
答案 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]"