【问题标题】:Parsing twitter @name with regex and javascript使用正则表达式和 javascript 解析 twitter @name
【发布时间】:2011-08-23 19:27:42
【问题描述】:

我正在尝试使用 javascript 解析 twitter 名称标签,并且想知道这个正则表达式是否可以解决问题。我认为这大部分都有效,但我只是想知道我是否正确使用了 $1 和 $2。人们能否确认这是正确的,如果是,请大致解释一下 $1 和 $2 代表什么?

str = str.replace(/([^\w])\@([\w\-]+)/gm,'$1<a href="http://twitter.com/$2" target="_blank">@$2</a>'); 

【问题讨论】:

    标签: javascript jquery regex twitter


    【解决方案1】:

    我认为你正在使用the $n right

    $n$nn
    其中 nnn 是十进制数字,插入第 n 个带括号的子匹配字符串,前提是第一个参数是 RegExp 对象。

    因此,您的 $1 将替换为匹配的 [^\w]$2 将替换为匹配的 [\w\-]+。但是,我认为您希望在第一组中多一些,以便您可以正确匹配 "@pancakes" 之类的字符串,(^|\W+) 会更好地为您服务:

    str = str.replace(/(^|\W+)\@([\w\-]+)/gm,'$1<a href="http://twitter.com/$2" target="_blank">@$2</a>');
    

    您可能想阅读JavaScript regular expressions

    而且,感谢 Kobi,您可以使用更简单的正则表达式,但您必须稍微更改一下替换项:

    str = str.replace(/\B@([\w-]+)/gm, '<a href="http://twitter.com/$1" target="_blank">@$1</a>');
    

    当连字符不会被误认为是范围指示符时,您不需要转义它。

    【讨论】:

    • 谢谢。 (^|\W+) 到底是做什么的?
    • \B@([\w\-]+) 应该有同样的效果 - 你想匹配没有单词边界的地方,这与检查前一个字母是否不是字母数字相同。
    • @cfarm54:^ 匹配字符串的开头,| 表示“或”,\W+ 匹配一个或多个非单词字符(\W+ 是一种较短的说[^\w]+)。
    • @Kobi:好的,谢谢。太多微妙不同的正则表达式风格。这也会改变替换模式。我将使用该模式添加更新。
    • @cfarm54:这里有一些关于 JavaScript 正则表达式的好文档:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
    【解决方案2】:

    第一组 ([^\w]) 需要是可选的,所以试试这个:/([^\w])?\@([\w-]+)/gm

    可以在此处找到用于测试正则表达式的出色在线工具:http://gskinner.com/RegExr/

    【讨论】:

    • 亩太短是对的,(^|\W+) 第一组比较好。
    • 我想说的是,您可以识别@name 而不是字母数字字符。主要是因为如果有人输入xx@gmail.com,那么它不会算这个。
    • 啊,有道理。为了进行测试,请使用我工具链接的工具来针对您想要匹配和/或不匹配的不同字符串运行正则表达式。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多