如何在Ruby中使用一个或两个regexp替换DokuWiki嵌套列表字符串?
例如,如果我们有这个字符串:
* one
* two
* three
* four
我们应该得到这个HTML:
我做了一个正则表达式替换整个列表。例如:
s.sub!(/(^\s+\*\s.+$)+/m, '<ul>\1</ul>')
它可以正常工作。但是如何替换单个列表项?
答案 0 :(得分:1)
正则表达式:
以下是一些示例列表:
* first item
* second item
No longer a list
* third item? no, it's the first item of the second list
* first item
* second item with linebreak\\ second line
* third item with code: <code>
some code
comes here
</code>
* fourth item
匹配所有列表的正则表达式
(?<=^|\n)(?: {2,}\*([^\n]*?<code>.*?</code>[^\n]*|[^\n]*)\n?)+
查看实际操作:http://rubular.com/r/VMjwbyhJTm
代码:
使用<ul>...</ul>
s.sub!(/(?<=^|\n)(?: {2,}\*(?:[^\n]*?<code>.*?<\/code>[^\n]*|[^\n]*)\n?)+/m, '<ul>\0</ul>')
添加缺失的<li>
s(以下代码中的 s2 是添加了<ul>...</ul>
的字符串)
s2.sub!(/ {2,}\*([^\n]*?<code>.*?<\/code>[^\n]*|[^\n]*)\n?/m, '<li>\1</li>')
注意: 使用此正则表达式无法处理嵌套列表。如果这是一个要求,解析器将更适应!