1

我正在努力使用 javascript 中的正则表达式,它需要 # 之后的文本到第一个单词边界,但如果它是 url 的一部分,则不匹配它。所以

#test - 应该匹配 test
sometext#test2 - 应该匹配 test2
xx moretext#test3 - 应该匹配 test3
http://test.com#tab1 - 不应该匹配 tab1

我用链接替换散列后的文本(但不是散列字符本身)。文本中可以有多个散列,并且应该匹配所有散列(我想我应该使用 /g )。

匹配散列后的部分非常容易:/#\b(.+?)\b/g,但如果字符串本身以“http”开头,则不匹配是我无法解决的问题。我可能应该使用负面的环顾四周,但我在解决这个问题时遇到了问题。

任何帮助是极大的赞赏!

4

3 回答 3

1

由于 JS 不支持lookbehinds,因此请尝试使用负前瞻这个正则表达式:

/^(?!http:\/\/).*#\b(.+?)\b/

www根据您的情况,您可能也需要检查。

编辑:然后你可以这样做:

str = str.replace(re.exec(str)[1], 'replaced!');

http://jsfiddle.net/j7c79/2/

编辑 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!
于 2012-10-01T20:46:10.267 回答
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 演示(将一些计时信息打印到控制台)

参考:

于 2012-10-02T20:18:29.747 回答
0

这需要回顾一下,遗憾的是 JavaScript 的功能缺乏一些东西。

但是,如果您的主题字符串是一些 HTML 并且这些 URL 在href属性中,您可以从中创建一个文档并搜索文本节点,只替换它们nodeValue的 s 而不是整个 HTML 字符串。

于 2012-10-01T20:33:33.360 回答