RegEx匹配G +配置文件URL

时间:2014-08-30 15:02:06

标签: javascript regex

我一直在尝试仅匹配Google+帐户的URI的用户ID或虚荣部分。我正在使用GAS(Google脚本引擎),我已加载XRegExp以帮助匹配Unicode字符。

到目前为止,我有这个:((https?://)?(plus\.)?google\.com/)?(.*/)?([a-zA-Z0-9._]*)($|\?.*)您可以看到regex tests (external site)仍然不匹配正确的部分。

我尝试在\p{L}内使用[a-zA-Z0-9._],但没有运气。此外,当匹配时,我最终在配置文件名称的末尾添加了一个额外的正斜杠。

更新#1:我正在尝试修复从Google表单复制的电子表格中的某些G +网址。这些链接并不完全相同,最简单的个人资料链接是" https://plus.google.com/" +用户ID或虚荣名称。

更新#2:到目前为止,我([+]\w+|[0-9]{21})(?:\/)?(?:\w+)?$使用@demrks简化版@guest271314的响应。但是,有两个问题:

1)Google虚荣网址中可以包含unicode。示例:https://plus.google.com/u/0/+JoseManuelGarcía_ertatto失败。我曾试图使用\ p {L},但似乎无法做到正确。

2)虽然regex tests适用于此网站,但GAS似乎并不喜欢它。 =(

更新#3 :看起来GAS只是讨厌使用\w,所以我不得不扩展它。所以到目前为止我有这个:

/([+][A-Za-z0-9-_]+|[0-9]{21})(?:\/)?(?:[A-Za-z0-9-_]+)?$/ 

这与" / about"相匹配或" / posts"在URL的末尾。但是仍然与UNICODE不匹配。 =(我还在努力。

更新#4:所以这似乎有效:     /([+][\\w-_\\p{L}]+|[\\d]{21})(?:\/)?(?:[\\w-_]+)?$/

看起来我需要在角色类的一侧做双反斜杠。所以这似乎到目前为止工作。不确定是否有更短的方法来使用它。

4 个答案:

答案 0 :(得分:3)

修改,更新

尝试(v4)

document.URL.match(/\++\w+.*|\d+\d|\/+\w+$/).toString()
.replace(/\/+|posts|about|photos|videos|plusones|reviews/g, "")

如,

var urls = ["https://plus.google.com/+google/posts"
            , "https://plus.google.com/+google/about"
            , "https://plus.google.com/+google/photos"
            , "https://plus.google.com/+google/videos"
            , "https://plus.google.com/+google/plusones"
            , "https://plus.google.com/+google/reviews"
            , "https://plus.google.com/communities/104645458102703754878"
            , "https://plus.google.com/u/0/LONGIDHERE"
            , "https://plus.google.com/u/0/+JoseManuelGarcía_ertatto"];
var _urls = [];

urls.forEach(function(item) {
  _urls.push(item.match(/\++\w+.*|\d+\d|\/+\w+$/).toString()
            .replace(/\/+|posts|about|photos|videos|plusones|reviews/g, ""));

});

_urls.forEach(function(id) {
    var _id = document.createElement("div");
    _id.innerHTML = id;
    document.body.appendChild(_id)
});

jsfiddle http://jsfiddle.net/guest271314/o4kvftwh/

答案 1 :(得分:1)

此解决方案应匹配ID和用户名(使用unicode字符):

/\+[^/]+|\d{21}/

http://regexr.com/39ds0

说明:作为\w(与unicode字符不匹配)的替代方法,我使用了一个否定组[^/](匹配“/”之外的任何内容)。< / p>

答案 2 :(得分:0)

遵循可能的解决方案:

(?:\+)(\w+)|(?:\/)(\w+)$

说明:

  • 第一种选择:(?:\+)(\w+)

    (?:\+)非捕获组:\+字面匹配字符+。捕获组(\w+)\w+匹配任何单词字符[a-zA-Z0-9_]。量词:在一个和无限之间 次。

  • 第二种选择:(?:\/)(\w+)$(?:\/)非捕获组。 \/字面匹配字符/。捕获小组(\w+)\w+匹配任何字符[a-zA-Z0-9_]。量词:在一次和无限次之间。 $在字符串末尾断言位置。

希望它有用!

答案 3 :(得分:0)

所以这似乎有效: /([+][\\w-_\\p{L}]+|[\\d]{21})(?:\/)?(?:[\\w-_]+)?$/

看起来我需要在角色类的一侧做双反斜杠。所以这似乎到目前为止工作。不确定是否有更短的方法来使用它。