【发布时间】:2018-07-17 12:12:31
【问题描述】:
我试图在一个字符串中找到满足所有给定条件的可能子集。
- 第一个字母是小写英文字母。
- 接下来,它包含零个或多个以下字符的序列:
小写英文字母、数字和冒号。- 接下来,它包含一个正斜杠“/”。
- 接下来,它包含以下一个或多个字符的序列:
小写英文字母和数字。- 接下来,它包含一个反斜杠“\”。
- 接下来,它包含一个或多个小写英文字母的序列。
给定一些字符串 s,我们定义如下:
- s[i..j] 是一个子字符串,由索引 i 和索引 j 之间的包含范围内的所有字符组成。
- 如果 i1 ≠ i[2],则称两个子字符串 s[i1..j1] 和 s[i[2]..j[2]] 是不同的或 j1 ≠ j[2]。
例如,您的命令行是abc:/b1c\xy. 有效的命令子字符串是:
abc:/b1c\xy
bc:/b1c\xy
c:/b1c\xy
abc:/b1c\x
bc:/b1c\x
c:/b1c\x
我用^([a-z])([a-z0-9:]*)(/)([a-z0-9]+)([\\])([a-z]*)解决了这个问题
但这不满足第二个条件,我尝试了 ^([a-z])([a-z0-9:]*)(/)([a-z0-9]+)([\\])([a-z]+[a-z]*) 但仍然对于 w:/a\bc 它应该是 2 个子集 [w:/a\b,w:/a\bc] 但通过正则表达式,它的 1 是 obviuos 。我做错了什么
正则表达式工具:Check
编辑:为什么 w:/a\bc 应该产生两个子集 [w:/a\b, w:/a\bc],因为它满足所有 6 个约束,并且它的不同之处在于 'w:/a\bc' 是 w:/a\b 的超集,
【问题讨论】:
-
您认为您可能会从字符串中的同一位置开始获得两个匹配项的想法是错误的。
-
@MaciejLos ,正确的请参见示例 1 和 4。
-
如果我理解这些条件的含义,我可以提供帮助。为什么
w:/a\bc会产生['w:/a\b','w:/a\bc']?为什么它们不同? -
@Wiktor 同意你的观点,但这是技巧,区分不同的原因 w:/a\b, w:/a\bc 将是两个不同的集合,而不是一个。
-
您的第一个条件不满足。我建议测试这个正则表达式模式:
^([a-z]){1}([a-z0-9]{0,}:/)([a-z0-9]{1,})([\\])([a-z]{1,})BTW:我建议下载并安装Expresso,这在创建和测试正则表达式模式的过程中非常方便。