【发布时间】:2018-07-19 14:09:17
【问题描述】:
给定两个字符串
hello/world/thomas
还有:
hello/world
我有以下正则表达式
hello/(.+)(/(.+))?
第二组是可选的。
我希望有以下小组赛:
['world', 'thomas']
但我得到了:
['world/thomas']
第二个字符串按预期工作:
['world']
我怎样才能产生预期的结果。
【问题讨论】:
-
使用否定字符类:
hello/([^/]+)(/([^/]+))? -
@WiktorStribiżew 只是出于好奇(据我所知)
[]被认为是一个类、一个集合还是两者兼而有之?这些术语似乎可以互换使用。 -
@ctwheels 在 POSIX 上下文中,它被称为 括号表达式(以免与诸如
[:digit:]之类的 POSIX 字符类混淆)。在 NFA 世界中,它通常称为字符类,有时也称为字符集(可互换使用)。 -
只在第一组中使用惰性量词
-
如果是
hello/world/today/is/thomas/tommorrow/is/james,你想匹配什么?无论如何,如果是定位的,你不能使用像.+?这样的东西而不用它后面的字符来锚定它。如果后面的 all 是可选的,则它选择不匹配任何内容。最好坚持使用带有可选量词的否定类[^/]*。
标签: regex capture-group