如何使用java.util.regex.Pattern获得最佳匹配

时间:2013-05-17 10:41:36

标签: java regex

这是我的用例。我有不同的文件处理模块,根据文件名调用。因此,如果文件名与模块将拾取文件的某个模块相关联的模式匹配。 我有一个catch定义的模式用于进行默认处理,但是这个模式只有在我没有更好的匹配时才会启动。

考虑以下情况

Pattern 1 -    Sample_[0-9]*.xls  
Pattern 2 -    [a-zA-Z]*_[0-9]*.xls

现在给定一个文件"Sample_11",我希望模式1被应用为比模式2更好的匹配,但是方法java.util.regex.Pattern.matcher().matches()只返回true或false。 有没有办法确定哪种匹配更好?

编辑: 模式是在系统外部定义的(这是一个奇怪的用例),所以我无法订购 他们是许多人建议的。从某种意义上说,我期待推断匹配的结果,以确定这是否是最佳匹配。希望这能澄清我的问题。

谢谢,

RAAM

2 个答案:

答案 0 :(得分:1)

使用责任链设计模式(wiki here)。循环(或迭代列表)通过每个正则表达式Pattern从最具体到最不具体,直到找到匹配的。然后对该匹配进行适当的处​​理。

答案 1 :(得分:1)

为什么这里的布尔值不够?您的逻辑应首先检查更具体的正则表达式(或正则表达式列表),沿着与任何特定正则表达式匹配相关的代码路径。如果找不到特定模式的匹配,它应该只进入catch。我认为布尔值应该适合你,除非你的问题还有更多我看不到。

想象一个Map,其中键是模式,值是用于处理匹配的自定义接口(让我们称之为MatchHandler)。迭代映射,如果模式匹配,则调用MatchHandler。如果不匹配,请检查默认模式,如果匹配,则调用默认的MatchHandler。如果您需要有序处理,可以使用LinkedHashMap。

现在,如果你不知道手头的模式(听起来就是你的情况)那么事情会变得有点棘手。一个可能的答案是编写另一个正则表达式来评估模式中一般匹配结构的出现(如[a-z],*等)。具有更多这些通用匹配结构的模式将是不太具体的匹配。它并不完美,但它可以适用于你正在做的事情。由于它正在使用正则表达式本身寻找基于正则表达式的构造,所以请确保在这个其他模式中进行大量的转义。