首页 > 解决方案 > 正则表达式匹配字符串中相同子字符串中的最后一个子字符串

问题描述

例如我们有一个字符串:asd/asd/asd/asd/1#s_

我需要匹配这部分:/asd/1#s_ 或 asd/1#s_ 如何使用普通的正则表达式?

我已经尝试过像这样的负前瞻但它没有用

\/(?:.(?!\/))?(asd)(\/(([\W\d\w]){1,})|)$

它与此 'prefix/asd/asd/asd/asd/asd/asd/1#s_' 中的此 '/asd/asd/asd/asd/asd/asd/1#s_' 匹配,我需要匹配 '/asd /1#s_' 没有前面的所有 /asd/'s

匹配应该与普通正则表达式一起使用没有任何编程语言的任何辅助函数 https://regexr.com/ 我使用这个站点来检查正则表达式是否匹配

这是可能的字符串:

prefix/asd/asd/asd/1#s
prefix/asd/asd/asd/1s#
prefix/asd/asd/asd/s1#
prefix/asd/asd/asd/s#1
prefix/asd/asd/asd/#1s
prefix/asd/asd/asd/#s1

并且 asd 部分可以替换为任何单词,例如

prefix/a1sd/a1sd/a1sd/1#s
prefix/a1sd/a1sd/a1sd/1s#
...

所以我需要将最后一个重复部分与右边的所有内容匹配并且右边的所有内容都可以是字符,而不是字符,数字,以任何顺序

一个更复杂的字符串示例:

前缀/a1sd/a1sd/a1sd/1s#/ds/dsse/a1sd/22$$@!/123/321/asd

这应该与该部分匹配:

/a1sd/22$$@!/123/321/asd

标签: regex

解决方案


试试这个。这适用于python。

import re

reg = re.compile(r"\/[a-z]{1,}\/\d+[#a-z_]{1,}")
s = "asd/asd/asd/asd/1#s_"

print(reg.findall(s))
# ['/asd/1#s_']

更新:

由于这个问题不够清晰,这仅适用于给定的顺序,因此,我想任何其他组合都会失败。

编辑:

新正则表达式

reg = r"\/\w+(\/\w*\d+\W*)*(\/\d+\w*\W*)*(\/\d+\W*\w*)*(\/\w*\W*\d+)*(\/\W*\d+\w*)*(\/\W*\w*\d+)*$"

推荐阅读