G+个人资料网址的正则表达式匹配

3
我一直在尝试匹配Google+帐户URI的用户ID或自定义部分。我正在使用GAS(Google脚本引擎),并加载了XRegExp来帮助匹配Unicode字符。
到目前为止,我有这个:((https?://)?(plus\.)?google\.com/)?(.*/)?([a-zA-Z0-9._]*)($|\?.*),你可以看到正则表达式测试(外部网站)仍然无法正确匹配部分内容。
我已经尝试在[a-zA-Z0-9._]中使用\p{L},但没有成功。另外,当匹配成功时,我最终会多出一个斜杠在个人资料名称的末尾。 更新 #1: 我正在尝试修复从Google表单复制的电子表格中的一些G+ URL。这些链接并不完全相同,最简单的个人资料链接是 "https://plus.google.com/" + 用户ID或vanity名称。

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

1) Google Vanity URLs 可以包含Unicode字符。例如:https://plus.google.com/u/0/+JoseManuelGarcía_ertatto 会失败。我已经尝试使用 \p{L} 但似乎无法正确使用。

2) GAS 似乎不喜欢它,即使在此站点上 正则表达式测试 也可以工作。 =(

更新 #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-_]+)?$/ 看起来我需要在字符类内部使用双反斜杠。目前这似乎可以工作。不确定是否有更短的方法来使用它。

你使用的所有虚荣名称和用户ID都以+开头吗? - Academia
所有的短网址都以"+"开头,但用户ID则不会。因此它更像是一个[+]?条件。 - flamusdiu
4个回答

3
编辑,更新
尝试(v4)
document.URL.match(/\++\w+.*|\d+\d|\/+\w+$/).toString()
.replace(/\/+|posts|about|photos|videos|plusones|reviews/g, "")

e.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/

这句话的意思是:在这个段落中插入一个 jsfiddle 的链接,链接地址为 http://jsfiddle.net/guest271314/o4kvftwh/。

@flamusdiu 我认为你可以稍微修改一下guest273114的正则表达式...像这样应该可以工作:\++\w+|[0-9]{21} - mrksbnch
某些原因,GAS 不喜欢使用 ++ 转义 "+". 我不得不每次都使用 [+]+ - flamusdiu
现在更新了问题并提供了额外的信息。感谢迄今为止的帮助! - flamusdiu
@demrks,你知道为什么 https://plus.google.com/u/0/+JackArnold7/posts 不匹配吗?这对我来说毫无意义。 - flamusdiu
@flamusdiu 对于我来说,对于你的测试字符串, /++\w+|\d+\d|/+\w+$/ ++\w+|[0-9]{21} 都能够正常工作。 - mrksbnch
显示剩余6条评论

1
这个解决方案应该匹配包括Unicode字符在内的ID和用户名:
/\+[^/]+|\d{21}/

http://regexr.com/39ds0

说明:作为\w的替代(不能匹配unicode字符),我使用了否定组[^/](匹配除“/”以外的任何字符)。

为什么你使用[0-9]而不是\d?顺便说一下,现在它可以工作了。总有一天我会变得更好的!...哈! - flamusdiu
@flamusdiu 我也不确定为什么我这样做了 :) 我已更新答案,谢谢! - mrksbnch

0

以下是可能的解决方案:

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

解释:

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

    (?:\+) 非捕获组:匹配字符+。捕获组(\w+):匹配任何单词字符[a-zA-Z0-9_]。量词:一次或多次。

  • 第二种选择:(?:\/)(\w+)$(?:\/) 非捕获组。匹配字符/。捕获组(\w+)。匹配任何单词字符[a-zA-Z0-9_]。量词:一次或多次。 $ 断言位置在字符串的结尾。

希望对你有用!


0

所以这似乎有效:

/([+][\\w-_\\p{L}]+|[\\d]{21})(?:\/)?(?:[\\w-_]+)?$/

看起来我需要在字符类内部使用双反斜杠。到目前为止,这似乎有效。不确定是否有更短的方法来使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接