Java 正则表达式找不到匹配项-有错误的.find()和.matches()之间的差异?

Java 正则表达式找不到匹配项-有错误的.find()和.matches()之间的差异?,java,regex,Java,Regex,代码之前的一些背景-我维护的系统本质上是一个自动SFTP解决方案,它轮询远程服务器,当它在某个目录中找到与已批准的正则表达式模式列表匹配的文件时,将一些文件拉到我们这边 昨天,一些新文件开始出现,尽管表中似乎有一个有效的模式,但没有作为文件进行匹配 下面是一个模式示例,该模式过去和现在都在系统中正常工作,以及我们收到的一个与之匹配的示例文件(pick是所有文件轮询发生的目录): 我已经验证了模式与文件匹配,并且模式列表中包含了正确的模式我的问题是,该错误是否可能是由于使用了matcher.fin

代码之前的一些背景-我维护的系统本质上是一个自动SFTP解决方案,它轮询远程服务器,当它在某个目录中找到与已批准的正则表达式模式列表匹配的文件时,将一些文件拉到我们这边

昨天,一些新文件开始出现,尽管表中似乎有一个有效的模式,但没有作为文件进行匹配

下面是一个模式示例,该模式过去和现在都在系统中正常工作,以及我们收到的一个与之匹配的示例文件(pick是所有文件轮询发生的目录):

我已经验证了模式与文件匹配,并且模式列表中包含了正确的模式我的问题是,该错误是否可能是由于使用了
matcher.find()
而不是
matcher.matches()
从我阅读的其他答案来看,
matches()
表示完全匹配,而
find()
表示部分匹配。事实上,我应该为我的用例使用
matches()

如果是这样的话,为什么这还没有打破任何其他模式,所有这些模式都类似于上面所示的工作模式?这里唯一的区别是,这是第一个.zip文件,也是第一次异化组不表示包含该文件本身的子文件夹-它只是名称的一部分

提前感谢您提供的任何帮助/澄清。

问题既不是(在您的情况下)

我修改了你的代码如下(为了在我的机器上运行它)

publicstaticvoidmain(字符串[]args){
字符串regex=“/PickUp/(?\\d{9})/rhinoceros\\d{9}\\d{8}.txt”;
字符串输入=“/picker/123456789/rhinoceros98765432120201110.txt”;
//字符串regex=“/PickUp/(?\\d{9})\\\d{8}\\\d{10}.zip”;
//字符串输入=“/PickUp/123456789_20201110_1234567890.zip”;
Pattern=Pattern.compile(regex);
Matcher Matcher=pattern.Matcher(输入);
if(matcher.find()){
System.out.println(matcher.groupCount());
}否则{
System.err.println(“不匹配”);
}
}
无论您使用的是
find()
还是
matches()
,您的输入都将只匹配一个组,如
groupCount()
所示。你的问题似乎是模式上的差异。您的
/PickUp/(?\\d{9})/rhinoceros\\d{9}\\d{8}.txt
PickUp
下的子目录匹配,而不是与文件名匹配。底部模式不使用第一个数字组作为子目录。相反,它使用它作为文件名的一部分;并且只匹配第一组数字


我不确定这是否是出于设计,但问题(IMO)在于模式本身;尤其是使用“lookahead”(在括号内使用问号)。

需要更多的上下文。你能在出现这个问题的地方建立一个最小的可运行的例子吗?我猜实际的角色并不是你想象的那样。例如,有不同的正斜杠字符具有不同的unicode代码点,但看起来相同,包括和。或者可能有像@xehpuk这样的非打印字符。在这里进行演示很难做到这一点,因为系统围绕着一个带有GSI的DynamoDB表旋转,而GSI是模式所在的位置。不过,您可以在这里运行Hello World,看看这些模式和文件是否匹配:也许我不够清楚。目标是匹配模式,然后提取组,这在文件处理中很有用。在肯定的情况下(rhinoceros文件/模式),进行匹配,然后保存异化组并在处理中使用。在这个问题案例中,根本不会进行匹配,即使应该通过对输入进行简单的模式测试。我想知道这是否是由于find()vs matches()的某些行为造成的,因为我使用同一个匹配器对输入循环所有模式。@Rome\u Leader这两种方法之间存在差异,但不是针对您提供的输入。在检查上面运行代码。我认为你做的比较不正确。
/PickUp/(?<foreignid>\\d{9})/rhinoceros\\d{9}\\d{8}.txt

/PickUp/123456789/rhinoceros98765432120201110.txt
/PickUp/(?<foreignid>\\d{9})_\\d{8}_\\d{10}.zip

/PickUp/123456789_20201110_1234567890.zip
int numMatches = 0;
for (PatternItem item : patternItems)
{
    matcher = item.getPattern().matcher(fileFound);
    if (matcher.find())
    {
        successfulMatch = matcher.group("foreignid");
        numMatches++;
    }
}

if (numMatches == 1)
{
    //download the file in here
}
else if (numMatches > 1)
{
    logger.error("More than one match found for file: " + fileFound + " - regex may be too permissive.");
    return "UNKNOWN_MULTI_MATCH";
}
else
{
    logger.error("Could not find match for file: " + fileFound);
    return "UNKNOWN_NO_MATCH";
}
public static void main(String[] args) {
    
    String regex = "/PickUp/(?<foreignid>\\d{9})/rhinoceros\\d{9}\\d{8}.txt";
    String input = "/PickUp/123456789/rhinoceros98765432120201110.txt";
    // String regex = "/PickUp/(?<foreignid>\\d{9})_\\d{8}_\\d{10}.zip";
    // String input = "/PickUp/123456789_20201110_1234567890.zip";
    
    
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    
    if (matcher.find()) {
        System.out.println(matcher.groupCount());
    } else {
        System.err.println("No match");
    }
}