2016-01-22 84 views
0

我有一个这样的字符串:如何为字符串中的所有相同URL定义相同的数字?

var str = "this is [link1][1] 
      this is [link2][2] 

      this is [link3][3] 
      this is [link4][4] 

      [1]: http://example1.com 

      [2]: http://example2.com 
      [3]: http://example1.com 


      [4]: http://example4.com"; 

现在我想这样的:

var str = "this is [link1][1] 
      this is [link2][2] 

      this is [link3][1] 
      this is [link4][4] 

      [1]: http://example1.com 
      [2]: http://example2.com 
      [4]: http://example4.com"; 

正如你在上面的例子中看到有两件事情:

  1. 删除之间的冗余\n所有这些网址(只有网址)
  2. Remo已经重复的URL和替换refrence数(换句话说,在上面的例子中,因为第一和第三URL是相同的,那么[3]: http://example1.com拆卸和替换[3][1]

有一个正则表达式它匹配[any digit]:及其两种url组:

/(\[[0-9]*]:)\s*(.*)\r?\n?/gm 

str,该正则表达式匹配:

//group1 
$1: [1]: 
    [2]: 
    [3]: 
    [4]: 

//group2 
$2: http://example1.com 
    http://example2.com 
    http://example1.com 
    http://example4.com 

也有另一个正则表达式其中仅删除链接之间的所有废物\n

str.replace(/(^\[[0-9]*]:.*)\n+/gm, $1\n); 

好了,我该怎么办呢?

回答

1

这可能是YOUT问题的解决方案:

function removeMultipleMatkdownLinks(markownString) { 
    var seperateLinks = /(\[[0-9]*]):\s*(.*)\r?\n?/gm; 
    var removeNewLines = /(^\[[0-9]*]:.*)\n+/gm; 

    var result; 
    var urls = [], ids = []; 
    var formattedString = str; 
    while ((result = seperateLinks.exec(str)) !== null) { 
     if (result.index === seperateLinks.lastIndex) { 
      result.lastIndex++; 
     } 
     //check if link already exists 
     var index = urls.indexOf(result[2]); 
     if(index < 0) { 
     urls.push(result[2]); 
     ids.push(result[1]); 

     } else { //remove links and replace ids 
     var removeLink = new RegExp("(\\" + result[1] + ":.*\\r?\\n?)", "gm"); ///(\[1\]:.*\n)/gm 
     var changeNumber = new RegExp("(\\" + result[1] + ")", "gm"); 
     formattedString = formattedString 
      .replace(removeLink, "") 
      .replace(changeNumber, ids[index]); 
     } 
    } 

    return formattedString.replace(removeNewLines, "$1\n"); 
} 

JSFiddle

+0

那么输出似乎是正确的......谢谢。 +1 – stack

相关问题