我正在尝试从某些字符串创建链接。我试过这个:
([^&]#)([0-9]+)(?![^<>]*>)
但它并不能正常工作。
Test 1: j
Test 2: #1040
Test 3: some text followed by #1060
Test 4: <a href="#1060">#1060</a>
Test 5: <b>#1078</b> (...or any other tag except <a>)
- 测试
1
和4
:不应匹配。 - 测试
2
、3
和5
:应该匹配。
即它应该匹配任何标记中的 #number
,链接标记(也不是它的属性)除外。
这是一个 jsfiddle,您可以在其中对其进行测试:http://jsfiddle.net/xqnjs2uq/3/
有问题的正则表达式被标记为“regex3”,我在其中包含了另外两个正则表达式,因为它们是全局的一部分——只是为了能够检查这个正则表达式是否会干扰其中的任何一个。
更新 在@chsdk 的帮助下,我设法找到了一种方法来使用两个正则表达式(请参阅以下 jsfiddle 中的 regex3 和 regex4)...
http://jsfiddle.net/xqnjs2uq/6/
/[^&|href="]+(#[0-9]+\b)/gim --> matches Test 3 and 5 above
/^(#[0-9]+)/ --> required to match Test 2 above
一等奖是将其压缩成一个正则表达式。这可能吗?
最佳答案
只需使用以下正则表达式 /[^&|href="](#[0-9]+)/g
.
这是 a live DEMO ,给出这些结果:
与以下比赛:
编辑:
我错过了你想避免在链接中匹配这个表达式的部分,这是你需要的正则表达式:
[^&|"](#[0-9]+\b)(?!<\/a>)
我们添加了 \b
在这里确保它在单词边界处采用整个表达式并且 (?!<\/a>)
以避免匹配链接。
这是 the Live DEMO 再次,您可以在以下代码段中对其进行测试:
var re = /[^&|"](#[0-9]+\b)(?!<\/a>)/g;
var str = 'Test 1: j\nTest 2: #1040\nTest 3: some text followed by #1060\nTest 4: <a href="#1060">#1060</a>\nTest 5: <b>#1078</b> (...or any other tag except <a>)';
var m;
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
document.write("<b>" + m[1] + "</b><br/>");
}
关于javascript - 创建一个 javascript 正则表达式来查找以 # 开头的数字(但不包括 HTML 特殊字符或现有链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32370140/