DokuWiki嵌套列表正则表达式

时间:2011-10-01 18:15:24

标签: ruby regex markup dokuwiki

如何在Ruby中使用一个或两个regexp替换DokuWiki嵌套列表字符串?

例如,如果我们有这个字符串:

  * one
  * two
    * three
  * four

我们应该得到这个HTML:

  • 一个
  • 2
    • 3
  • 4

我做了一个正则表达式替换整个列表。例如:

s.sub!(/(^\s+\*\s.+$)+/m, '<ul>\1</ul>')

它可以正常工作。但是如何替换单个列表项?

1 个答案:

答案 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>')

注意: 使用此正则表达式无法处理嵌套列表。如果这是一个要求,解析器将更适应!