Ruby 我如何在第一次发生时停止比赛?
我需要用Ruby正则表达式来消化一些bbcode 我必须使用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中的字符串,并使用\转义
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}
允许定义命名的子模式,这些子模式可以在以后使用,而无需匹配任何内容。“贪婪”表示正则表达式尝试使用尽可能多的输入。“非格雷迪”表示相反。:-)