正则表达式提取包含用户ID字符串的URL的最后一部分

时间:2014-11-10 19:51:07

标签: regex

我很难搞清楚这一点并且可以使用一些帮助。

我正在使用Google Analytics过滤器,通过从即将进入的网址中删除ID字符串来减少在我们的应用中报告的唯一网页数量。

我需要的是一个正则表达式,用于查找URL中包含这些ID的URL。以下是它们与URL其余部分的区别:

  • ID字符串始终是URL的最后一部分
  • ID字符串始终包含字母和数字
  • ID字符串的长度始终为16或32个字符
  • ID字符串可以在网址中显示两次
  • ID字符串可以以“/”或不带
  • 结尾

以下是一些示例网址,展示了它们在我们的报告中的显示方式:

/app/6be031b9672be9b5/
/app/admin/client/settings/6be031b9672be9b5
/app/subscribers/ea33fb38c9efc4dc0367819f23434f99/
/app/subscribers/customfieldsettings/0359c487066727ae/
/app/reports/6fa92d36be0e6c16/dc5aa096fba9cbb97eea1dae616d4b3c/

我的问题的第二部分是这个正则表达式还应该将这些ID字符串之前的所有内容分组到一个捕获组中,以便我可以稍后在过滤器中调用该组,从而有效地剥离这些ID字符串,如下所示:

  • / app / 6be031b9672be9b5 / - > /应用程序/
  • / app / subscribers / ea33fb38c9efc4dc0367819f23434f99 / - > /应用程序/用户/

我尝试过几种不同的方法,但似乎没有一种方法可以完美运行,所以我真的可以使用这些帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

这是一个解决方案:

^(.*?)(?:\/[a-zA-Z0-9]{16}|\/[a-zA-Z0-9]{32}){0,2}\/?$

Demo

这将删除长度为16或32个字符且仅包含字母和数字的最后一部分或两部分URL。

如果工具支持前瞻,您可以确保这些部件包含字母和数字:

^(.*?)(?:\/(?=.{0,15}?\d)(?=.{0,15}?[a-zA-Z])[a-zA-Z0-9]{16}|\/(?=.{0,31}?\d)(?=.{0,31}?[a-zA-Z])[a-zA-Z0-9]{32}){0,2}\/?$

Demo

这会为模式添加断言。

故障:

^(.*?)                   # Start of URL
(?:
  \/                     # a slash
  (?=.{0,15}?\d)         # check there's a digit at most 16 chars ahead
  (?=.{0,15}?[a-zA-Z])   # check there's a letter at most 16 chars ahead
  [a-zA-Z0-9]{16}        # check the next 16 chars are digits or letters
|                        # .. or:
  \/                     # a slash
  (?=.{0,31}?\d)         # check there's a digit at most 32 chars ahead
  (?=.{0,31}?[a-zA-Z])   # check there's a letter at most 32 chars ahead
  [a-zA-Z0-9]{32}        # check the next 32 chars are digits or letters
){0,2}                   # .. at most 2 times
\/?$                     # optional slash at end

答案 1 :(得分:0)

这样做:

([a-z0-9]+)(?:\/?$)

Demo

说明:

  • ([a-z0-9]+)匹配并捕获字母数字部分
  • (?:\/?$)查找(但不匹配或捕获)可选的最终/,然后查找字符串的结尾($

答案 2 :(得分:0)

修改 - 完全错过了最后可能是1或2个id 哦,修改后的fwiw。

 #  (?i)^(.*?)/((?:(?=[^/]{0,31}[a-f])(?=[^/]{0,31}[0-9])(?:[a-f0-9]{16}|[a-f0-9]{32})(?:(?:/[a-z])?/?$|/)){1,2})$

 (?i)                          # Case insensitive modifier
 ^                             # BOS, begin the ride ..
 ( .*? )                       # (1), Kreep up on the first ID
 /                             # Trim this / junk
 (                             # (2 start), 1-2 ID's separated by a /
      (?:
           (?= [^/]{0,31} [a-f] )        # Use largest range (32), Must be a lettr AND number
           (?= [^/]{0,31} [0-9] )
           (?:                           # One of 16 or 32 length
                [a-f0-9]{16} 
             |  [a-f0-9]{32} 
           )
           (?:
                (?: / [a-z] )?                #  optional / letter
                /? $                          #  /? EOS for end of 1 or 2 
             |                              # or,
                /                             # / between 2 only 
           )
      ){1,2}
 )                             # (2 end)
 $                             # EOS, rides over !!

示例输出:

 **  Grp 0 -  ( pos 195 , len 63 ) 
/app/reports/6fa92d36be0e6c16/dc5aa096fba9cbb97eea1dae616d4b3c/  
 **  Grp 1 -  ( pos 195 , len 12 ) 
/app/reports  
 **  Grp 2 -  ( pos 208 , len 50 ) 
6fa92d36be0e6c16/dc5aa096fba9cbb97eea1dae616d4b3c/