【发布时间】:2016-04-02 18:38:01
【问题描述】:
当所有组都可能是可选的时,我无法提取组。
上下文(如果喜欢,可以跳到结尾): 这是在将字符串与一组正则表达式进行最佳匹配的上下文中,并查看哪个表达式具有最多的组匹配。
例如,我可能有一种潜在的格式;
1: [A|B] [CD|DE|EF]-[1-1|1-2|2-2|2-3] [G|H]
但我希望用户输入错误,或者不包含空格或其他内容。
所以我可能会针对字符串对其进行测试
A CD-1-1 G
想要组团
- 一个
- 光盘
- 1-1
- G
另外,对于测试字符串
DE-1-9 G
我想买
- 德国
- G
所以这是我的正则表达式来匹配以下可选组
[A|B] [CD|DE|EF]-[1-1|1-2|2-2|2-3] [G|H]
正则表达式:
(A|B)?(?: *)?(CD|DE|EF)?(?:-|(?: ))?((?:1-(?:1|2))|(?:2-(?:2|3)))?(?: *)?(G|H)?
分解我认为这应该如何工作;
- (A|B)? - 匹配“A”或“B”字符(可能存在也可能不存在)。
- (?: *)? - 匹配一些空格字符(可能不存在),但不需要组。
- (CD|DE|EF)? - 匹配“CD”“DE”或“EF”(可能存在也可能不存在)。
- (?:-|(?: ))? - 匹配一个“-”或一些空格(可能有也可能没有)。
- ((?:1-(?:1|2))|(?:2-(?:2|3)))? - 匹配 [1-[1|2]] 或 [2-[2|3]](可能不正确/根本不存在)
- (?: *)? - 匹配一些空格字符(可能不存在),但不需要组。
- (G|H)? - 匹配“G”或“H”字符(可能存在也可能不存在)。
这个与我期望的组不匹配与测试字符串的问题
A CD 1-9 G
我期待团体
- 一个
- 光盘
- G
但我明白了
- 一个
- 光盘
为什么在第三组之后不匹配?
【问题讨论】:
-
我认为 Wiktor 的模式有效,为了回答您的问题,
[1-1|1-2|2-2|2-3]是可选的,但是只有在它的位置没有任何内容时,`G` 才会匹配。1-9打破了这种模式。 Wiktor 通过在每个中心模式中允许一个空的替代方案来解决这个问题。
标签: regex