我试图将一个字符串与一个模式相匹配,该模式可以包含具有相同模式的子字符串。
这是一个示例字符串:
尼加拉瓜[[注释|注释|刚果自1999年起成为ICCROM成员,1971年成为尼加拉瓜成员。2013年11月,ICCROM大会暂停了这两项成员,但连续六年没有缴纳会费(ICCROM [[法规] s | url | www.iccrom.org/about/statutes/]],第9条。]]。可能出现的另一个[[link | url | google.com]]。
以及这里的模式:
[[display_text|code|type|content]]
所以,我想要的是在括号内获取字符串,然后查找更多与顶级模式匹配的字符串。
我想要的是匹配这个:
- [[注意| s |注释|刚果自1999年起成为ICCROM成员,1971年成为尼加拉瓜成员。2013年11月,ICCROM大会暂停了这两项成员,连续六年没有缴纳会费(ICCROM [[章程] | s | url | www.iccrom.org/about/statutes/]],第9条。]]
醇>1.1 [[法规| s | url | www.iccrom.org/about/statutes /]]
- [[链路| S | URL | google.com]
醇>
我正在使用此/(\[\[.*]])/
但它会获得所有内容,直到最后]]
。
我想要的是能够识别匹配的字符串并将其转换为HTML元素,其中|note|
将是一个blockquote标记,|url|
是a
标记。因此,blockquote标记可以在其中包含链接标记。
顺便说一下,我正在使用CoffeeScript来做到这一点。
提前致谢。
答案 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。格式化程序留给用户练习:)。