正则表达式分组问题

Regex grouping issue

我需要一个正则表达式来对我的字符串进行分组,但我无法正确分组。

字符串必须以 "foo/" 开头,以 "login" 或 "something" + "/" + (set|get).

结尾
    ^foo\/(login$|(.*)\/(set|get))

"login" 或 "something" 必须是组 1
"set" 或 "get" 必须是第 2 组(如果存在)。

Test strings:
foo/
foo/login   -match
foo/login/get
foo/sadas/set   -match
foo/sadasf/asd
foo/blabla/get   -match

分组应采用以下格式。

             Group1          Group2
foo      /   login
foo      /   sadasas     /    set
foo      /   blabla      /    get

试试这个正则表达式:

^foo\/(?(?=login)(login)|(.*?)(set|get))$

Click for Demo

解释:

  • ^ - 断言行的开始
  • foo\/ - 按字面意思匹配 foo/
  • (?(?=login)(login)|(.*?)(set|get)) - 如果当前位置后跟 login,则匹配 login 并将其捕获为第 2 组,否则匹配 0+ 次出现的任何字符(在第 1 组中捕获) 后跟 setget(在第 3 组中捕获)
  • $ - 断言字符串结束

更新解决方案

^foo\/(login$|(?!login).*?(?=[gs]et))([gs]et)?$

Click for Demo

刚刚意识到这与 Wiktor 的评论非常接近