我试图掩盖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]"