Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 我如何在第一次发生时停止比赛?_Ruby_Xml_Regex_Match_Bbcode - Fatal编程技术网

Ruby 我如何在第一次发生时停止比赛?

Ruby 我如何在第一次发生时停止比赛?,ruby,xml,regex,match,bbcode,Ruby,Xml,Regex,Match,Bbcode,我需要用Ruby正则表达式来消化一些bbcode 我必须使用match命令对元素进行分隔,并使用regexp/pattern/m删除换行符 例如,字符串中的bbcode是: s="[b]Title[/b] \n Article text \n [b]references[/b]" 然后我使用match来界定文本的各个部分,特别是标题和引用部分,它们被括在[b]和[b]之间: t=s.match(/\[b\](.*)\[\/b\]/m) 我使用(…)语法捕获regexp中的字符串,并使用\转义

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

我必须使用
match
命令对元素进行分隔,并使用regexp
/pattern/m
删除换行符

例如,字符串中的bbcode是:

s="[b]Title[/b] \n Article text \n [b]references[/b]"
然后我使用
match
来界定文本的各个部分,特别是标题和引用部分,它们被括在
[b]
[b]
之间:

t=s.match(/\[b\](.*)\[\/b\]/m)
我使用
(…)
语法捕获regexp中的字符串,并使用
\
转义特殊的
[
]
字符
/m
是为了去掉字符串中的换行符

然后
t[1]
包含:

"Title[/b] \n Artucle text \n [b]references"
而不是
“Title”
。因为匹配不会在第一次出现
[/b]
时停止。由于同样的原因,
t[2]
是nil而不是“References”


如何将包含在常用bbcode标记之间的文本部分划界?

使用非贪婪运算符
如下所示:

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

如果您确定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)
#定义
(?\[(?\w++)[^\]]*\]
(?>[^\[]+\g)*
\[\/\g\]
){0}
#主模式
\[b\](?(?>[^\[]+\g)*)\[\/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\]
          /)
t=s.match(/(?x)
#定义
(?\[(?:img | hr)\b[^\]*\]){0}
(?\[(?\w++)[^\]]*\]
(?>[^\[]+\g |\g)*
\[\/\g\]
){0}
#主模式
\[b\](?(?>[^\[]+\g\g)*)\[\/b\]
/)
注意:
{0}
允许定义命名的子模式,这些子模式可以在以后使用,而无需匹配任何内容。

“贪婪”表示正则表达式尝试使用尽可能多的输入。“非格雷迪”表示相反。:-)