我正在尝试创建一个匹配markdown网址的正则表达式,但忽略它之前和之后的内容。它应仅匹配指向本地文件的本地markdown网址,并忽略指向外部网站的网址。例如:
"dddd [link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored](../../../filepath/folder/some-other-folder/another-folder/one-last-folder/file-example.html). lorem ipsum lorem"
应该只匹配第二个链接。目前,它匹配一切。我的正则表达式适用于我需要的东西,但这似乎是我找到的主要优势。
到目前为止我所拥有的:
/(!?\[.*?\]\((?!.*?http)(?!.*?www\.)(?!.*?#)(?!.*?\.com)(?!.*?\.net)(?!.*?\.info)(?!.*?\.org).*?\))/g
目前,这忽略了第一个链接并匹配第二个链接,如果第二个链接在第一个链接之后没有出现。否则,它匹配从第一个到第二个的所有内容。
我正在使用JavaScript,它不支持负面的外观。有什么建议吗?
答案 0 :(得分:1)
有两个问题。
\[.*?\]
将超过]
并匹配[link which should be ignore](http://google.com/) lorem ipsum lorem ips sum loreerm [link which shouldn't be ignored]
,因此它将匹配断言。 你可以修复1& 2用这个正则表达式
((!?\[[^\]]*?\])\((?:(?!http|www\.|\#|\.com|\.net|\.info|\.org).)*?\))
( # (1 start)
( !?\[ [^\]]*? \] ) # (2), Link
\( # Open paren (
(?: # Cluster
(?! # Not any of these
http
| www\.
| \#
| \.com
| \.net
| \.info
| \.org
)
. # Ok, grab this character
)*? # End cluster, do 0 to many times
\) # Close paren )
) # (1 end)
指标
----------------------------------
* Format Metrics
----------------------------------
Cluster Groups = 1
Capture Groups = 2
Assertions = 1
( ? ! = 1
Free Comments = 7
Character Classes = 1
答案 1 :(得分:0)
测试网址是本地还是外部不正则表达式的作业。正如您在示例字符串中的第三个链接所看到的那样,测试uri是否包含.org
,.com
,http
,#
或其他任何错误。
此代码显示了如何在客户端的替换上下文中知道URL是否是本地的:
var text = '[external link](http://adomain.com/path/file.txt) ' +
'[local link](../path/page.html) ' +
'[local link](../path.org/http/file.com.php#fragment)';
text = text.replace(/\[([^\]]*)\]\(([^)]*)\)/g, function (_, g1, g2) {
var myurl = document.createElement('a');
myurl.href = g2;
return window.location.hostname == myurl.hostname ? "locrep" : "extrep";
});
console.log(text);