我在Java中有应用程序,用户将以特定格式提供带文件名的文件。例如: james-fcanada-csmith-l.txt ,
其中-f是firstName的指示符,-c是country的指示符,-l是lastname的指示符。
为此我创建了这个RegEx ([\w\d\s].*)-f([\w\d\s].*)-c([\w\d\s].*)-l
,它运行正常。
但是,如果用户更改字段的顺序,请说 smith-ljames-fcanada-c.txt (首先添加姓氏),则此RegEx无效.. < / p>
请使用RegEx建议如何达到此类要求。
另外,请告诉我是否还有其他更好的方法可以实现这一目标。
答案 0 :(得分:1)
解决问题的一种简单方法可能是使用三个单独的正则表达式,然后逐个运行。
对于-f使用此:
^([^-]*-[^f])*([^-]*?)-f([^-]*-[^f])*\..*$
另一个更复杂的解决方案可能是像antlr
这样的解析器,对于这个用例来说可能过于复杂。
答案 1 :(得分:0)
答案 2 :(得分:0)
你可以使用Positive Lookahead
(我想这就是所谓的)。
(?=([\w\d\s].*)-f)(?=([\w\d\s].*)-c)(?=([\w\d\s].*)-l)
这将按任何顺序匹配字符串。
答案 3 :(得分:0)
我不会用一个正则表达式来做这件事。但是,如果你坚持:
(\w+)-([fcl])(\w+)-(?!\2)([fcl])(\w+)-(?!\2|\4)([fcl])
说明:
([\w\d\s].*)
代替(\w+)
,这似乎是在这种情况下做的工作。您可以还原它并仍然获得正确的结果。顺便说一句\w
包含\d
。([fcl])
中的任何一个,然后当第二个破折号出现时,我们匹配第一个匹配的角色的不存在,使用负前瞻后跟任何一个再次三次 - (?!\2)([fcl])
,对于最终匹配,我们匹配第一个或第二个匹配字符的不存在,然后是三个中的任何一个 - (?!\2|\4)([fcl])
。|
时不同。以下是java转义版本:
(\\w+)-([fcl])(\\w+)-(?!\\2)([fcl])(\\w+)-(?!\\2|\\4)([fcl])
为canada-csmith-ljames-f.txt
执行此操作后,您将获得:
canada
,第二组= c
smith
,第4组= l
james
,第6组= f
答案 4 :(得分:0)
使用String.split()
将参数拆分为字段,然后可以迭代这些参数以获取值:
String[] args = filename.split('-');
for (String arg : args)
{
if (arg.startsWith("f")
{
firstName = arg;
}
else if (arg.startsWith("c")...
}
使用此参数,您的参数可以在文件名中以任何顺序出现。