4

我需要用 Ruby 正则表达式消化一些 bbcode。

我必须用match命令分隔元素并使用正则表达式/pattern/m来摆脱换行符。

例如,我在字符串中的 bbcode 是:

s="[b]Title[/b] \n Article text \n [b]references[/b]"

然后我用它match来分隔文本的各个部分,尤其是标题和引用部分,它们包含在[b]和之间[/b]

t=s.match(/\[b\](.*)\[\/b\]/m)

我使用(..)语法来捕获正则表达式中的字符串,并使用\转义特殊字符[]字符。/m就是去掉字符串中的换行符。

然后t[1]包含:

"Title[/b] \n Artucle text \n [b]references"

而不是"Title". 因为匹配不会在[/b]. 出于同样的原因,它是 nil而t[2]不是“References”。

如何分隔通常的 bbcode 标签之间的文本部分?

4

2 回答 2

9

像这样使用非贪心运算符?

t=s.match(/[b](.*?)[/b]/m)
于 2013-06-04T00:34:58.983 回答
1

如果您确定不会在 bbcode 标记之间遇到左方括号,则可以使用排除它们的字符类:

t=s.match(/\[b\]([^\[]*)\[\/b\]/)

但是如果您的[b]标签可以包含其他标签,则需要使用递归模式:

t=s.match(/(?x)
    # definitions
    (?<tag> \[ (?<name> \w++ ) [^\]]* \]
            (?> [^\[]+ | \g<tag> )*
            \[\/\g<name>\]
    ){0}

    # main pattern
    \[b\] (?<content> (?> [^\[]+ | \g<tag> )* ) \[\/b\]
          /)

如果你必须处理自闭标签:

t=s.match(/(?x)
    # definitions
    (?<self> \[ (?:img|hr)\b [^\]]* \] ){0}
    (?<tag> \[ (?<name> \w++ ) [^\]]* \]
            (?> [^\[]+ | \g<self> | \g<tag> )*
            \[\/\g<name>\]
    ){0}

    # main pattern
    \[b\] (?<content> (?> [^\[]+ | \g<self> | \g<tag> )* ) \[\/b\]
          /)

注意:{0}允许定义命名的子模式,以后可以使用而不匹配任何东西。

于 2013-06-04T01:42:02.803 回答