如何在 Ruby 中使用一两个正则表达式替换 DokuWiki 嵌套列表字符串?
例如,如果我们有这个字符串:
* one
* two
* three
* four
我们应该得到这个 HTML:
- 一
- 二
- 三
- 四
我做了一个正则表达式替换整个列表。例如:
s.sub!(/(^\s+\*\s.+$)+/m, '<ul>\1</ul>')
它可以正常工作。但是如何替换单个列表项?
正则表达式:
以下是一些示例列表:
* 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
编码 :
用 a 包围所有列表<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>')
注意: 嵌套列表不能用这个正则表达式处理。如果这是一个要求,解析器将更适应!