RegEx分裂并记住匹配(优雅)

时间:2016-01-18 05:21:24

标签: javascript regex string str-replace

我正在尝试为维基百科的API响应编写解析器。它真的很杂乱,我已经使用好旧的RegEx来清理大多数东西。但我坚持这个。考虑一个字符串:

 var a ="[[December 1]]  A triangular [[Conjunction (astronomy)|conjunction]] formed by a new Moon, Venus and Jupiter is a [[Conjunction (astronomy)#2008|prominent sight]] in the evening sky. [[December 2]]";

我希望此字符串中的文字为:

 "December 1  A triangular conjunction formed by a new Moon, Venus and Jupiter is a prominent sight in the evening sky. December 2"

我在处理方括号[,]时遇到问题。我不能只删除它们,因为链接表示如下:

 [[Conjunction (astronomy)#2008|prominent sight]]

在这种情况下,我想删除部分" Conjunction(天文学)#2008"因为网页上显示的实际字符串是"突出的视线"。在JavaScript中的一个str.replace(//gi,"")查询中是否有一种优雅的方法来处理这两种情况?

我这样做a.replace(/\[\[.*\|/gi, "");并产生:

 "prominent sight]] in the evening sky. [[December 2]]"

很明显,我需要将连续的开始和结束括号[[]]作为模式进行匹配,然后记住我认为的匹配。我不知道如何解决这个问题,但我希望这两个案例是明确的:

  1. [[ normal word ]] - >正常的话
  2. [[ some definition blah |foo bar]] - > foo bar

2 个答案:

答案 0 :(得分:4)

您可以使用String#replace进行回调并使用以下RegEx

/\[{2}([\w\s()#]+)(?:\|([\w\s]+))?\]{2}/

Regex Demo

RegEx说明:

  1. \[{2}([\w\s()#]+)
    • \[{2}:匹配[[
    • ([\w\s()#]+):匹配任何字母数字字符_,空格,()#一次或多次并将其放入第一个被捕集团。
  2. (?:\|([\w\s]+))?\]{2}
    • (?::非捕获组
    • \|:匹配竖线符号|
    • ([\w\s]+):匹配字母数字字符,_和空格一次或多次并放入第二个捕获的组
    • \]{2}:匹配]]
  3. RegEx Visualization 更易于理解

    Visualization

    <强>演示:

    &#13;
    &#13;
    var regex = /\[{2}([\w\s()#]+)(?:\|([\w\s]+))?\]{2}/g;
    var str = "[[December 1]]  A triangular [[Conjunction (astronomy)|conjunction]] formed by a new Moon, Venus and Jupiter is a [[Conjunction (astronomy)#2008|prominent sight]] in the evening sky. [[December 2]]";
    
    str = str.replace(regex, function(c, m1, m2) {
      return m2 ? m2 : m1;
    });
    
    document.body.innerHTML = '<pre>' + str + '</pre>';
    &#13;
    &#13;
    &#13;

      

    这个正则表达式不适用于我在问题中提到的字符串,但它适用于我在评论中提出的字符串

         

    &#34;日本岩手县的[[2008年岩手 - 宫城内陆地震| 6.9级地震]]造成12人死亡,400多人受伤。&#34;

    您可以使用以下RegEx。

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

答案 1 :(得分:1)

\[\[(?:([^|]*)|[^|]*\|(.*?))\]\]

您可以使用它并替换为$1$2。请参阅演示。

https://regex101.com/r/iJ7bT6/9