正则表达式:将字符串与具有相同模式的子字符串匹配

时间:2015-06-19 00:11:43

标签: javascript regex coffeescript

我试图将一个字符串与一个模式相匹配,该模式可以包含具有相同模式的子字符串。

这是一个示例字符串:

  

尼加拉瓜[[注释|注释|刚果自1999年起成为ICCROM成员,1971年成为尼加拉瓜成员。2013年11月,ICCROM大会暂停了这两项成员,但连续六年没有缴纳会费(ICCROM [[法规] s | url | www.iccrom.org/about/statutes/]],第9条。]]。可能出现的另一个[[link | url | google.com]]。

以及这里的模式:

[[display_text|code|type|content]]

所以,我想要的是在括号内获取字符串,然后查找更多与顶级模式匹配的字符串。

我想要的是匹配这个:

  
      
  1. [[注意| s |注释|刚果自1999年起成为ICCROM成员,1971年成为尼加拉瓜成员。2013年11月,ICCROM大会暂停了这两项成员,连续六年没有缴纳会费(ICCROM [[章程] | s | url | www.iccrom.org/about/statutes/]],第9条。]]
  2.         

    1.1 [[法规| s | url | www.iccrom.org/about/statutes /]]

         
        
    1. [[链路| S | URL | google.com]
    2.   

我正在使用此/(\[\[.*]])/但它会获得所有内容,直到最后]]

我想要的是能够识别匹配的字符串并将其转换为HTML元素,其中|note|将是一个blockquote标记,|url|a标记。因此,blockquote标记可以在其中包含链接标记。

顺便说一下,我正在使用CoffeeScript来做到这一点。

提前致谢。

1 个答案:

答案 0 :(得分:1)

通常,正则表达式不擅长处理嵌套表达式。如果你使用贪婪的模式,它们会匹配太多,如果你使用非贪婪的模式,正如@bjfletcher建议的那样,它们匹配得太少,停在外部内容中。这里的“传统”方法是一个基于令牌的解析器,您可以逐个遍历字符并构建一个抽象语法树(AST),然后根据需要重新格式化。

我在这里使用的一种稍微有点hacky的方法是将字符串转换为JSON字符串,让JSON解析器完成转换为嵌套对象的艰苦工作:http://jsfiddle.net/t09q783d/1/

function toPoorMansAST(s) {
    // escape double-quotes, as they'll cause problems otherwise. This converts them
    // to unicode, which is safe for JSON parsing.
    s = s.replace(/"/g, "\u0022");
    // Transform to a JSON string!
    s =
        // Wrap in array delimiters
        ('["' + s + '"]')
        // replace token starts
        .replace(/\[\[([^\|]+)\|([^\|]+)\|([^\|]+)\|/g,
             '",{"display_text":"$1","code":"$2","type":"$3","content":["')
        // replace token ends
        .replace(/\]\]/g, '"]},"');

    return JSON.parse(s);
}

这为您提供了一个字符串和结构化对象的数组,然后您可以通过格式化程序来运行您想要的HTML。格式化程序留给用户练习:)。