Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java.util.regex.Pattern获得最佳匹配_Java_Regex - Fatal编程技术网

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

如何使用java.util.regex.Pattern获得最佳匹配,java,regex,Java,Regex,这是我的用例。我有不同的文件处理模块,这些模块是根据文件名调用的。因此,如果文件名匹配与某个模块关联的模式,该模块将拾取该文件。 我定义了一个catch-all模式,用于进行默认处理,但只有在没有更好的匹配时,这个模式才会生效 考虑以下场景 Pattern 1 - Sample_[0-9]*.xls Pattern 2 - [a-zA-Z]*_[0-9]*.xls 现在给定一个文件“Sample_11”,我希望应用模式1作为比模式2更好的匹配,但是方法java.util.reg

这是我的用例。我有不同的文件处理模块,这些模块是根据文件名调用的。因此,如果文件名匹配与某个模块关联的模式,该模块将拾取该文件。 我定义了一个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。 有没有办法确定哪一个匹配更好

编辑: 模式是在系统之外定义的(这是一个奇怪的用例),所以我不能订购 正如许多人所建议的那样。从某种意义上说,我希望通过推断匹配结果来决定这是否是最佳匹配。希望这能澄清我的问题

谢谢


Raam使用责任链设计模式()。在每个正则表达式
模式中循环(或向下迭代列表),从最特定到最不特定,直到找到一个匹配的正则表达式。然后对该匹配进行适当的处理。

为什么这里的布尔值不够?您的逻辑应该首先检查更具体的正则表达式(或正则表达式列表),沿着与任何特定正则表达式匹配的代码路径前进。只有在没有找到与特定模式匹配的情况下,它才应该继续进行“包罗万象”。我认为布尔值应该适合你,除非你的问题有更多我看不到的地方

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


现在,如果你不知道之前的模式(听起来你就是这样),那么事情就变得有点棘手了。一个可能的答案是编写另一个正则表达式来评估模式中一般匹配结构的出现情况(如[a-z]、*,等等)。这些常规匹配结构出现次数较多的模式将是不太具体的匹配。这不是完美的,但它可以为你所做的工作。只需确保在另一个模式中进行大量转义,因为它正在使用regex本身寻找基于regex的构造

尝试第一种模式1-如果有任何匹配项,那么您知道您有更好的匹配项,并且不需要使用模式2。正则表达式将“最佳”定义为“最长”。这就是你的定义吗?想象一个模式的有向图,其中更具体的模式是不太具体的模式的子模式。(如果你不能,这个问题就没有意义了)。从最具体到最不具体地应用模式,这样,除非应用了模式的所有子项,否则永远不会应用模式。更明确和限制的模式是最好的(通常)