2

这是我的用例。我有基于文件名调用的不同文件处理模块。因此,如果文件名与与某个模块关联的模式匹配,则该模块将获取该文件。我定义了一个 catch all 模式,用于进行默认处理,但是只有在我没有更好的匹配时才应该使用这种模式。

考虑以下场景

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。有什么方法可以确定什么是更好的匹配?

编辑:模式是在系统外部定义的(这是一个奇怪的用例),所以我不能按照许多人的建议对它们进行排序。从某种意义上说,我正在寻找推断匹配的结果以决定这是否是最佳匹配。希望这能澄清我的问题。

谢谢,

拉姆

4

2 回答 2

1

为什么布尔值在这里不够用?您的逻辑应该首先检查更具体的正则表达式(或正则表达式列表),沿着与任何特定正则表达式匹配的代码路径向下。只有在没有找到特定模式的匹配项时,它才应该继续捕获所有内容。我认为布尔值应该适合您,除非您的问题还有更多我看不到的问题。

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

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

于 2013-05-17T10:49:52.557 回答
1

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

于 2013-05-17T10:46:46.117 回答