Java正则表达式包含搜索

时间:2015-07-01 05:38:32

标签: java regex

我在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建议如何达到此类要求。

另外,请告诉我是否还有其他更好的方法可以实现这一目标。

5 个答案:

答案 0 :(得分:1)

解决问题的一种简单方法可能是使用三个单独的正则表达式,然后逐个运行。

对于-f使用此:

^([^-]*-[^f])*([^-]*?)-f([^-]*-[^f])*\..*$

http://regexr.com/3bab0

另一个更复杂的解决方案可能是像antlr这样的解析器,对于这个用例来说可能过于复杂。

答案 1 :(得分:0)

我建议您使用正则表达式替换运算符|

"([\\w\\d\\s][^-\n]*)-f|([\\w\\d\\s][^-\n]*)-c|([\\w\\d\\s][^-\n]*)-l"

DEMO

答案 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
  • 第3组= smith,第4组= l
  • 第5组= 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")...
}

使用此参数,您的参数可以在文件名中以任何顺序出现。