英文:
Match a RegEx to the same Group based on a conditional match of a string pattern- in Golang
问题
我有两个测试字符串:
mp4/dach/zdf/22/07/220724_traumorte_italiens_romantische_inseln_inf/1/220724_traumorte_italiens_romantische_inseln_inf_508k_p9v15.mp4
和
/mp4/none/zdf/21/11/211124_1925_sendung_ban/1/211124_1925_sendung_ban_a3a4_508k_p9v15.mp4
我想要一个单一的正则表达式来匹配第一个字符串,并得到输出:
/dach/zdf/22/07/220724_traumorte_italiens_romantische_inseln_inf/1/220724_traumorte_italiens_romantische_inseln_inf
我可以使用正则表达式 ^.*[mp][4](.+)(?:a[0-9]a[0-9])?(?:.+_.+_.+_|_.+_).*$
或 ^.*[mp][4](.+)(a[0-9]a[0-9]?(.+_.+_.+_)|(_.+_)).*$
来实现这个目的。
但是这个正则表达式也会将第二个字符串匹配为 /none/zdf/21/11/211124_1925_sendung_ban/1/211124_1925_sendung_ban_a3a4
。
而我的期望是,如果存在 a3a4
,则匹配 3 次 _;否则匹配 2 次 _。这样,第二个字符串应该匹配为 /none/zdf/21/11/211124_1925_sendung_ban/1/211124_1925_sendung_ban
。
但是,不知何故,这个正则表达式没有按照预期进行分组(Group -1)。
如果有任何指导,我将不胜感激。
谢谢!
英文:
I have two test strings
mp4/dach/zdf/22/07/220724_traumorte_italiens_romantische_inseln_inf/1/220724_traumorte_italiens_romantische_inseln_inf_508k_p9v15.mp4
and
/mp4/none/zdf/21/11/211124_1925_sendung_ban/1/211124_1925_sendung_ban_a3a4_508k_p9v15.mp4
I want a single RegEx to match the first string to get an output
/dach/zdf/22/07/220724_traumorte_italiens_romantische_inseln_inf/1/220724_traumorte_italiens_romantische_inseln_inf
which I get with the RegEx ^.*[mp][4](.+)(?:a[0-9]a[0-9])?(?:.+_.+_.+_|_.+_).*$
or
^.*[mp][4](.+)(a[0-9]a[0-9]?(.+_.+_.+_)|(_.+_)).*$
but this matches the second string as /none/zdf/21/11/211124_1925_sendung_ban/1/211124_1925_sendung_ban_a3a4
but my expectation is to match 3 times _ if a3a4
is present; otherwise 2 times _
which should get the match /none/zdf/21/11/211124_1925_sendung_ban/1/211124_1925_sendung_ban
for the second string.
But, somehow this is not grouping (Group -1) as intended.
Any pointers on this is appreciated.
Thanks!
答案1
得分: 1
你可以使用以下正则表达式进行匹配:
^\S*?\bmp4(/\S*?)(?:_a[0-9]a[0-9])?(?:_[^\s_]*){2}\.mp4$
解释
^
字符串的开头\S*?\bmp4
匹配可选的非空白字符,尽可能少地匹配,然后匹配mp4
(
捕获组 1/\S*?
匹配/
,然后匹配可选的非空白字符,尽可能少地匹配
)
结束 捕获组 1(?:_a[0-9]a[0-9])?
可选地匹配非捕获组中的模式(?:_[^\s_]*){2}
重复两次_
和除了_
和空白字符之外的任意字符\.mp4
匹配.mp4
$
字符串的结尾
可以在 regex demo 中查看演示。
英文:
You could use:
^\S*?\bmp4(/\S*?)(?:_a[0-9]a[0-9])?(?:_[^\s_]*){2}\.mp4$
Explanation
^
Start of string\S*?\bmp4
Match optional non whitespace chars, as least as possible, and them matchmp4
(
Capture group 1/\S*?
Match/
and match optional non whitespace chars, as least as possible
)
Close group 1(?:_a[0-9]a[0-9])?
Optionally match the pattern in the non capture group(?:_[^\s_]*){2}
Repeat 2 times_
and any char except_
and a whitespace char\.mp4
Match.mp4
$
End of string
See a regex demo
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论