繁体   English   中英

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

[英]Regex: Match string with substrings with the same pattern

我正在尝试将字符串与模式匹配,该模式可以具有相同模式的子字符串。

这是一个示例字符串:

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

1.1 [[章程| s | url | www.iccrom.org/about/statutes/]]

  1. [链接| S |网址| google.com]

我正在使用这个/( /(\\[\\[.*]])/ ]]]]]]但它直到最后才获得所有]]

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

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

提前致谢。

通常,正则表达式不擅长处理嵌套表达式。 如果你使用贪婪的模式,它们会匹配太多,如果你使用非贪婪的模式,正如@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。 格式化程序留给用户:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM