2

我正在制作一个用于 Google Plus 的书签。我对我的正则表达式有点了解,但下面的测试几乎可以工作。

/\/([0-9]{10,30})|(\+[^\/]{2,30})\//.exec(window.location.pathname);

OR 之前的第一部分可以很好地提取旧样式的用户 ID 号,但提取新的虚荣样式 ID 的第二部分返回一个在相同位置带有“未定义”的数组。

旧式 URL 如下所示:

https://plus.google.com/u/0/113917445082638587047/posts
https://plus.google.com/113917445082638587047/posts

典型的虚 URL 如下所示:

https://plus.google.com/u/0/+MarkTraphagen/posts
https://plus.google.com/+MarkTraphagen/posts

对于虚 URL,我的正则表达式返回:

["+MarkTraphagen/", undefined, "+MarkTraphagen"]

“未定义”从何而来?我该如何摆脱它?


注意:上面的字符串长度(10 到 30 和 2 到 30)大致基于马桶水可接受的 pH 值,因此在使用它们之前请考虑这一点。

4

2 回答 2

5

移动您的捕获以获取第一种或第二种形式:

/\/([0-9]{10,30}|\+[^\/]{2,30})\//.exec(window.location.pathname);

那么您只有一个捕获的值,form#1 或 form#2。

未定义的出现是因为您有 2 个捕获而第一个不存在。

于 2012-09-10T18:47:24.993 回答
1

这是可能解决您问题的正则表达式模式。马桶水的 pH 值不应该影响正则表达式,这是一个普遍的规则。

/\/(\d{4,}|\+\w+?)\//g.exec(window.location.pathname);

你可以在这里看到结果。

请注意,您可以将4正则表达式中的数字替换为您想要的任何内容。此数字是捕获所需的最小位数。我不确定 Google 的 ID 采用什么格式,因此您可能希望将该数字更改为10,例如,如果您确定 ID 永远不会少于 10 位数字。

模式的解释在这里:

// /(\d{4,}|\+\w+?)/
// 
// Match the character “/” literally «/»
// Match the regular expression below and capture its match into backreference number 1 «(\d{4,}|\+\w+?)»
//    Match either the regular expression below (attempting the next alternative only if this one fails) «\d{4,}»
//       Match a single digit 0..9 «\d{4,}»
//          Between 4 and unlimited times, as many times as possible, giving back as needed (greedy) «{4,}»
//    Or match regular expression number 2 below (the entire group fails if this one fails to match) «\+\w+?»
//       Match the character “+” literally «\+»
//       Match a single character that is a “word character” (letters, digits, and underscores) «\w+?»
//          Between one and unlimited times, as few times as possible, expanding as needed (lazy) «+?»
// Match the character “/” literally «/»
于 2012-09-10T20:16:20.763 回答