2014-08-30 180 views
3

我一直在試圖匹配Google+帳戶的URI用戶標識或虛榮身份。我正在使用GAS(Google腳本引擎),我已經加載XRegExp來幫助匹配Unicode字符。RegEx匹配G +個人資料網址

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

我試過在[a-zA-Z0-9._]內使用\p{L},但沒有那個運氣。另外,當配置文件名稱匹配時,我最終會在配置文件名稱末尾添加一個額外的正斜槓。

UPDATE#1:我試圖修復從Google窗體複製的電子表格中的某些G + URL。鏈接不完全相同,最簡單的配置文件鏈接是「https://plus.google.com/」+用戶標識或虛榮名稱。

更新#2:到目前爲止,我有([+]\w+|[0-9]{21})(?:\/)?(?:\w+)?$與用途@demrks簡化@guest271314的響應的版本。但是,有兩個問題:

1)Google Vanity URL可以包含unicode。例如:https://plus.google.com/u/0/+JoseManuelGarcía_ertatto失敗。我曾嘗試使用\ p {L},但似乎無法正確使用。

2)雖然regex tests在這個網站上工作,但氣體似乎並不喜歡它的事件。 =(

更新#3:看來GAS只是討厭使用\w所以我不得不擴大它,所以我有這個至今:

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

這甚至與匹配「/約」 。或「/帖」在URL的末尾但是仍然不匹配UNICODE =(我還在工作對

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

看起來我需要在角色類的側面做雙反斜槓。所以這似乎工作到目前爲止。不知道是否有更短的方式來使用這個。

+0

您使用的所有虛榮名稱和用戶標識是否都以+開頭? – Academia 2014-08-30 15:35:45

+0

所有虛空網址都以「+」開頭,但所有用戶標識都沒有。所以它更多的是[+]?條件 – flamusdiu 2014-08-30 18:06:01

回答

1

該溶液還應當同時匹配ID和用戶名(Unicode字符):

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

http://regexr.com/39ds0

說明:至於\w替代(其不匹配Unicode字符)我用否定組[^/](與「/」匹配的任何內容)。

+0

爲什麼使用'[0-9]'而不是'\ d'?順便說一句,現在工作。有一天我會在這些方面變得更好! ... 哈! – flamusdiu 2014-08-30 23:08:17

+0

@flamusdiu不知道,爲什麼我這樣做:)我更新了答案,謝謝! – Daniel 2014-08-30 23:13:08

+0

大聲笑。好的。只是想知道是否有一些奇怪的原因。 =) – flamusdiu 2014-08-30 23:13:58

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/

+0

會失敗的東西,如:https://plus.google.com/u/0/LONGIDHERE – Daniel 2014-08-30 15:15:27

+0

是的,我有一個電子表格中的配置文件的URL列表,我需要提取的虛榮名稱(+ <某些配置文件或者用戶名(這恰好是21位數字) – flamusdiu 2014-08-30 15:17:32

+0

@flamusdiu我認爲你可以修改guest273114的正則表達式...類似這樣的東西應該可以工作:'\ ++ \ w + | [0-9] {21}' – Daniel 2014-08-30 15:20:26

0

以下可能的解決方案:

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

說明:

  • 第一備選物:(?:\+)(\w+)

    (?:\+)非捕獲組:\+字面上匹配字符+。捕獲組(\w+)\w+匹配任何單詞字符[a-zA-Z0-9_]。量詞:介於1和無限 次之間。

  • 第2種替代方案:(?:\/)(\w+)$(?:\/)非捕獲組。從字面上看,\/與字符/匹配。捕獲組(\w+)\w+匹配任何單詞字符[a-zA-Z0-9_]。量詞:在一次和無限次之間。 $在字符串末尾聲明位置。

希望它有用!

0

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

看起來我需要做雙反斜槓在字符類的一面。所以這似乎工作到目前爲止。不知道是否有更短的方式來使用這個。

相關問題