【问题标题】: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 之类的东西,一开始可能很轻松。
  • 使用\[\[.*?\]\]|''(.*?)'' 并提取捕获的组#1

标签: javascript regex mediawiki


【解决方案1】:

或许,你可以试试

''(.*?)''(?!(?:[^\[]*]{2}))

如果你不想匹配双引号字符串 里面有括号,你可以使用:

''([^\[\]]*?)''(?!(?:[^\[]*]{2}))

但是,请注意:嵌套括号会失败,例如:

[[ ''foo'' aksjdhkajd [[ asdasdasd ]] ]]

以及没有开括号的右括号,例如:

asdkjakldha ''akjdhkajdhksd'' ajsdlasjdlasd ]]

Javascript 不支持 lookbehindlookbehind 可以增强正则表达式。

看看这个: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
        }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多