使用正则表达式进行Ruby拆分-正则表达式为';i don’我不做我想做的事

使用正则表达式进行Ruby拆分-正则表达式为';i don’我不做我想做的事,ruby,regex,Ruby,Regex,我有这根绳子 string = "<p>para1</p><p>para2</p><p>para3</p>" string=“para1para2para3” 我想在para2文本上拆分,这样我就可以得到这个 ["<p>para1</p>", "<p>para3</p>"] [“para1”,“para3”] 问题是,有时para2可能没有包装在p标记中(并且在p的外部

我有这根绳子

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

para2

para3

我想在para2文本上拆分,这样我就可以得到这个

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

”,“para3

”]
问题是,有时para2可能没有包装在p标记中(并且在p的外部和内部可能有可选的空格)。我认为这样做可以:

string.split(/\s*(<p>)?\s*para2\s*(<\/p>)?\s*/)
string.split(/\s*()?\s*para2\s*()?\s*/)
但是,我明白了:

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

”、“”、“

”、“para3

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

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

XXXpara3

他们被拉进来,在这里被处理掉,但不是在裂缝上。有什么想法吗


谢谢,max将您的捕获组
(…)
替换为非捕获组
(?:…)

/\s*(?:)?\s*para2\s*(?:)?\s*/

记住,用正则表达式永远无法真正解析HTML。如果这个字符串在某种程度上依赖于外部输入,请使用hpricot或nokogiri之类的HTML解析器。这个答案是正确的。当你使用带有捕获组的正则表达式进行分割时,它会将捕获放入数组中,这样你就可以进行更复杂的扫描/分割操作。漂亮…不知道我们在Ruby中有这样的功能!谢谢秋葵,这就成功了。我以前从来没有听说过非捕获组,这是一个非常有用的知识点。
/\s*(?:<p>)?\s*para2\s*(?:<\/p>)?\s*/