【发布时间】:2010-08-06 15:35:17
【问题描述】:
三个下划线分隔的元素组成我的字符串: - 首先(字母和数字) - 中间(字母、数字和下划线) - 最后(字母和数字)
最后一个元素是可选的。
注意:我需要通过他们的名字而不是他们的索引来访问我的组。
例子:
String : abc_def
first : abc
middle : def
last : None
String : abc_def_xyz
first : abc
middle: def
last: xyz
String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl
last : xyz
我找不到正确的正则表达式...
到目前为止,我有两个想法:
可选组
(?P<first>[a-z]+)_(?P<middle>\w+)(_(?P<last>[a-z]+))?
但是中间组匹配到字符串的结尾:
String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl_xyz
last : vide
使用“|”
(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P<first>[a-z]+)_(?P<middle>\w+)
这个表达式无效:第一组和中间组被声明了两次。我虽然可以编写一个表达式,重用表达式第一部分的匹配组:
(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P=first)_(?P=middle)
表达式是有效的,但是像 abc_def 这样只有第一个和一个中间的字符串不匹配。
注意
这些字符串实际上是我需要匹配的路径的一部分。它可能是这样的路径:
- /my/path/to/abc_def
- /my/path/to/abc_def/
- /my/path/to/abc_def/some/other/stuf
- /my/path/to/abc_def/some/other/stuf/
- /my/path/to/abc_def_ghi_jkl_xyz
- /my/path/to/abc_def_ghi_jkl_xyz/
- /my/path/to/abc_def_ghi_jkl_xyz/some/other/stuf
- /my/path/to/abc_def_ghi_jkl_xyz/some/other/stuf/
- ...
有什么想法可以仅使用正则表达式来解决我的问题吗?不能对匹配的组进行后处理。
非常感谢!
【问题讨论】:
-
/my/path/to/是常量还是变量?如果变量,你怎么知道路径的哪一部分包含你试图从中提取子字符串的字符串?