G+配置文件URL的RegEx匹配

RegEx matching for G+ Profile URL

本文关键字:RegEx 匹配 URL 配置文件      更新时间:2023-09-26

我一直试图只匹配Google+帐户URI的用户id或虚荣部分。我正在使用GAS(谷歌脚本引擎),我已经加载了XRegExp来帮助匹配Unicode字符。

到目前为止,我有这样一个:((https?://)?(plus'.)?google'.com/)?(.*/)?([a-zA-Z0-9._]*)($|'?.*),您可以看到regex测试(外部站点)仍然不匹配正确的部分。

我试过在[a-zA-Z0-9._]中使用'p{L},但没有成功。此外,当配置文件名称匹配时,我会在其末尾添加一个额外的正斜杠。

更新#1:我正试图修复从谷歌表单复制的电子表格中的一些G+URL。链接并不完全相同,最简单的个人资料链接是"https://plus.google.com/"+用户名或虚名。

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

1) 谷歌虚荣的网址可以有unicode。示例:https://plus.google.com/u/0/+JoseManuelGarcía_ertatto失败。我试过使用''p{L},但似乎做不好。

2) GAS似乎不喜欢这个事件,尽管regex测试在这个网站上有效=(

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

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

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

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

看起来我需要在字符类的侧面做双反斜杠。到目前为止,这似乎奏效了。但不确定是否有较短的使用方法。

编辑、更新

尝试(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)
});

jsfiddlehttp://jsfiddle.net/guest271314/o4kvftwh/

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

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

http://regexr.com/39ds0

解释:作为'w(与unicode字符不匹配)的替代方案,我使用了否定组[^/](与"/"以外的任何字符匹配)。

遵循一个可能的解决方案:

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

说明:

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

    (?:'+)非捕获组:'+与字符+完全匹配。捕获组('w+):'w+匹配任何单词字符[a-zA-Z0-9_]。量词:介于1和无限之间时间。

  • 第二个备选方案:(?:'/)('w+)$(?:'/)非捕获组。CCD_ 18与字符CCD_。捕获组('w+)。CCD_ 21匹配任何单词字符CCD_。量词:介于一次和无限次之间。$断言字符串末尾的位置。

希望它有用!

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

看起来我需要在字符类的侧面做双反斜杠。到目前为止,这似乎奏效了。但不确定是否有较短的使用方法。