【问题标题】:How to match italic wiki markers but not inside wiki links如何匹配斜体wiki标记但不在wiki链接内
【发布时间】:2016-01-12 19:45:37
【问题描述】:
我需要匹配这样的字符串:''foo'',但在 wiki 链接中不需要匹配:[[GNU Lesser General Public License|GNU ''Lesser'' General Public License]]
我的尝试是这样,但它不起作用:
/''([^']*(?:'[^']+)*(?![^\]]+\]\]))''/g
【问题讨论】:
-
不要使用正则表达式。这不够规律。我建议使用 pegjs.org 之类的东西,一开始可能很轻松。
-
标签:
javascript
regex
mediawiki
【解决方案1】:
或许,你可以试试
''(.*?)''(?!(?:[^\[]*]{2}))
如果你不想匹配双引号字符串
里面有括号,你可以使用:
''([^\[\]]*?)''(?!(?:[^\[]*]{2}))
但是,请注意:嵌套括号会失败,例如:
[[ ''foo'' aksjdhkajd [[ asdasdasd ]] ]]
以及没有开括号的右括号,例如:
asdkjakldha ''akjdhkajdhksd'' ajsdlasjdlasd ]]
Javascript 不支持 lookbehind;
lookbehind 可以增强正则表达式。
看看这个:http://regexr.com/3cigm
【解决方案2】:
我已决定使用此代码处理链接内的斜体文本:
text = text.replace(/\[\[([^\]]+)\]\]/g, function(_, gr) {
gr = gr.split('|');
if (gr.length == 1) {
// normal wiki link
} else {
// wikilink with name and caption
gr[1] = gr[1].replace(/''([^']+)''/gm, function(_, g) {
// g is italic text
});
// gr[1] can contain italic text gr[0] is a link
}
})