我正在努力使用javascript中的正则表达式,需要#后面的文本到第一个单词边界,但如果它是url的一部分则不匹配。所以
#test - 应该匹配测试
sometext#test2 - 应匹配test2
xx moretext#test3 - 应该匹配test3
http://test.com#tab1 - 不应与tab1
我在哈希之后用链接替换文本(但不是哈希字符本身)。文本中可以有多个哈希值,并且它们应该全部匹配(我想我应该使用/ g)。
在哈希之后匹配部分非常简单:/#\ b(。+?)\ b / g,但如果字符串本身以“http”开头,则无法匹配,这是我无法解决的问题。我应该使用负面的环顾四周,但是我遇到了问题。
非常感谢任何帮助!
答案 0 :(得分:1)
使用负面预测来尝试此正则表达式,因为JS不支持lookbehinds:
/^(?!http:\/\/).*#\b(.+?)\b/
您可能还需要检查www
,具体取决于您的条件。
编辑然后你可以这样做:
str = str.replace(re.exec(str)[1], 'replaced!');
编辑2:如果太复杂,有时单独使用正则表达式是不可取的。尝试不同的方法:
var txt = "asdfgh http://asdf#test1 #test2 woot#test3";
function replaceHashWords(str, rep) {
var isUrl = /^http/.test(str), result = [];
!isUrl && str.replace(/#\b(.+?)\b/g, function(a,b){ result.push(b); });
return str.replace((new RegExp('('+ result.join('|') +')','g')), rep);
}
alert(replaceHashWords(txt, 'replaced!'));
// asdfgh http://asdf#replaced! #replaced! woot#replaced!
答案 1 :(得分:0)
这需要一个后瞻性的东西,遗漏了JavaScript的功能。
但是,如果您的主题字符串是某些HTML并且这些网址属于href
属性,您可以创建一个文档并搜索文本节点,只替换它们的nodeValue
而不是整个HTML字符串。
答案 2 :(得分:0)
正如正则表达式,经常(如果不是总是),使用起来相当昂贵,我建议使用基本的字符串和数组方法来确定给定的字符集是否代表一个URL(虽然我假设所有URLS将以http
字符串开头:
$('ul li').each(
function() {
var t = $(this).text(),
words = t.split(/\s+/),
foundHashes = [],
word = '';
for (var i = 0, len = words.length; i < len; i++) {
word = words[i];
if (word.indexOf('http') == -1 && word.indexOf('#') !== -1) {
var match = word.substring(word.indexOf('#') + 1);
foundHashes.push(match);
}
}
// the following just shows what, if anything, was found
// and can definitely be safely omitted
if (foundHashes.length) {
var newSpan = $('<span />', {
'class': 'matchedWords'
}).text(foundHashes.join(', ')).appendTo($(this));
}
});
JS Fiddle demo (with some timing information printed to the console)
参考文献: