2014-05-16 55 views
0

我想捕获指定标记对的内容,其内容可能包含空白和新行。这里有一个例子:匹配打开和关闭“标记”而不创建第二个匹配组

{section_title} 
Section 1 title 
with some white space 
{/section_title} 

我有一个正则表达式已经匹配在两个匹配组的内容,但是结果:

\{section_title\}((.|\s)*?)\{\/section_title\} 
  1. 第1题 一些空白
  2. (中尾随白色空间)

变异符合内容没有创建第二个匹配组,但不允许包含嵌套标签,我希望能够允许这样做。

\{section_title\}([^\{]*?)\{\/section_title\} 

有没有办法重构第一个正则表达式以避免第二个匹配组?我知道我可以删除所有“仅限白色空间”的比赛,但是想知道是否只有正则表达式。

另外,如果可能的话,我想匹配标签的替代版本:

{st} 
Section 1 title 
with some white space 
{/st} 

它可以添加在捕获组

\{(section_title|st)\}((.|\s)*?)\{\/(section_title|st)\} 

的办法,但我再次想避免额外的匹配。这可能吗?

我正在使用Ruby 1.9.3。

回答

0

我认为这样做最简单的方法是改变((.|\s)*?)(.*?)并添加(?m)的正则表达式,这会导致.也匹配换行符的开始。

str = "{sec_title}\nSection 1 title \nwith some white space\n{/sec_title}\n" 

r = /(?m)\{sec_title\}(.*?)\{\/sec_title\}/ 
str[r,1]  #=> "\nSection 1 title \nwith some white space\n" 

str[r,1]1是什么是(.*)拍摄的参考。

一概而论,

str = "{s1}\nSection 1 title \nwith some white space\n{/s1}\n" 

r = /(?m)\{(\w+)\}(.*?)\{\/\1\}/ 
str[r,2]  #=> "\nSection 1 title \nwith some white space\n" 

现在\1是反向引用于不是由第一个捕获组,(\w+)捕获,而2是到参考什么由第二捕获组,(.*)捕获。

对于多对,

str = "{s1}{s2}\nSection 1 title \nwith some white space\n{/s2}{/s1}\n" 

str[r,2]  #=> "{s2}\nSection 1 title \nwith some white space\n{/s2}" 
str[r,2][r,2] #=> "\nSection 1 title \nwith some white space\n" 

我们可以在方法与参数

def parse(str, *names) 
... 
end 

可变数目,我们会打电话

parse(str, "s1, "s2") 
+0

从开关'(这个包起来。 | \ s)*''到'/ m'模式'。*'是好的,但我不会急于删除非贪婪修饰符。 '(?m){name}(。*} {/ name}'将从第一个'{name}'匹配到最后一个'{/ name}',所以如果有多个同名的段,它也会匹配如果只有一个'{name}'部分,但文档非常大,'(。*?)'会比'(。*)'快得多 –

+0

谢谢。@Alan。我会信任的然后放回原处。事实上,我只是模糊地熟悉HTML!我做了一个错误的假设,即所有的名字都是唯一的。 –

+0

谢谢,这真的很高雅。另外,谢谢你逐步解释过程! – aaandre

相关问题