regex 是否捕获之间或之后/之前的最后一个元素?

db2dz4w8  于 2023-02-05  发布在  其他
关注(0)|答案(4)|浏览(107)

假设我有以下网址:

https://test.com/welcome/
https://sub.test.com/home/edit
https://test.com/home/view?view=column
https://test.com/home/view/?view=list

我想得到以下结果:

welcome
edit
view
view

现在我有(?:\/[^\/]+)+?\/(.*?)/{0,1}$(?:\/[^\/]+)+?(?:.*\/)(.*?)\?{0,1}$(?:\/[^\/]+)+?(?:.*\/)(.*)/\?.*$,但它们很复杂,我似乎无法将它们组合在一起。

eyh26e7m

eyh26e7m1#

在Splunk中,您可以使用正则表达式来匹配所有文本,直到最后一次出现/,后跟除/?#之外的任何1+字符,并且这些1+字符可以使用命名捕获组捕获:

".*/(?<lasturlpart>[^/?#]+)"

请注意,我的顶部注解中的\n(?:/?(?:[#?].*|$))在演示中用于确保匹配不会跨行溢出,因为在演示中输入的是单个多行字符串,而您将对独立字符串使用正则表达式。

图案详细信息

  • .*-除换行符外的任何0个或多个字符,尽可能多
  • /-一个/字符
  • (?<lasturlpart>[^/?#]+)-与/?#以外的一个或多个字符匹配的命名捕获组。
xpszyzbs

xpszyzbs2#

您可以使用普通正则表达式:

(?<=[\/])[^\/?=]+(?=\/?$|\/?\?)

Demo
正则表达式可以用 * 自由空格模式 *1编写,使其自文档化:

/ 
(?<=[\/])     # match '/' or '?' in positive lookbehind
[^\/?=]+       # match 1+ chars other than '/', '?' and '='
(?=            # begin a positive lookahead
  \/?$         # optionally map '/' then match end of line    
  |            # or
  \/?\?        # optionally match '/' then match '?'
)              # end positive lookahead
/x             # free-spacing mode

1.我不知道Splunk是否支持自由空间模式,但这无关紧要,因为我只是用它来展示正则表达式是如何工作的。

h7wcgrx3

h7wcgrx33#

| makeresults
| eval _raw="https://test.com/welcome/
https://sub.test.com/home/edit
https://test.com/home/view?view=column
https://test.com/home/view/?view=list"
| makemv delim="
" _raw
| stats count by _raw
| rex "^.*\/(?<result>\w+)"

贪婪匹配是可以的。

p1iqtdky

p1iqtdky4#

简单化-正则表达式都很好,但是split()要简单得多(而且通常要快得多):

index=ndx sourcetype=srctp url=*
| eval url=split(URL,"/")
| eval lastpart=mvindex(url,-1)

这将使用正斜杠(“/”)作为分隔符将字段url拆分为多值字段
然后使用mvindex-1的索引选择最后一项,-1始终是最后一项

相关问题