Ruby与正则表达式分裂 - 正则表达式没有做我想要的

时间:2010-01-29 18:30:03

标签: ruby regex

我有这个字符串

string = "<p>para1</p><p>para2</p><p>para3</p>"

我想分开para2文本,以便我得到这个

["<p>para1</p>", "<p>para3</p>"]

问题是有时para2可能不会被包装在p标签中(并且p外部和内部可能有可选空格)。我以为这会做到这一点:

string.split(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/)

但是,我明白了:

["<p>para1</p>", "<p>", "</p>", "<p>para3</p>"]

它不会将开始和结束p标记拉入匹配模式 - 它们应该作为拆分的一部分被删除。默认情况下Ruby的正则表达式是贪婪的,所以我认为它们会被拉入。而且,如果我做一个gsub而不是分裂,这似乎得到了证实:

string.gsub(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/, "XXX")
=> "<p>para1</p>XXX<p>para3</p>"

他们拉入并摆脱了这里,但不是分裂。任何人的想法?

谢谢,最大

1 个答案:

答案 0 :(得分:8)

将捕获组(…)替换为非捕获组(?:…)

/\s*(?:<p>)?\s*para2\s*(?:<\/p>)?\s*/