Java匹配器模式问题

Java匹配器模式问题,java,pattern-matching,matcher,Java,Pattern Matching,Matcher,我试图提取这个字符串路径/share/attachments/docs/之后的所有内容。我的所有字符串都以/share/attachments/docs开头/ 例如:/share/attachments/docs/image2.png ../docs/后面的字符数不是静态的 我试过了 Pattern p = Pattern.compile("^(.*)/share/attachments/docs/(\\d+)$"); Matcher m = p.matcher("/share/at

我试图提取这个字符串路径/share/attachments/docs/之后的所有内容。我的所有字符串都以/share/attachments/docs开头/

例如:/share/attachments/docs/image2.png ../docs/后面的字符数不是静态的

我试过了

   Pattern p = Pattern.compile("^(.*)/share/attachments/docs/(\\d+)$");
   Matcher m = p.matcher("/share/attachments/docs/image2.png");
   m.find();         
   String link = m.group(2);    
   System.out.println("Link #: "+link);
但我有一个例外:没有找到匹配项。 奇怪,因为如果我用这个:

   Pattern p = Pattern.compile("^(.*)ABC Results for draw no (\\d+)$");
   Matcher m = p.matcher("ABC Results for draw no 2888");
那就行了

还有一件事是,在一些非常罕见的情况下,我的字符串不以/share/attachments/docs/开头,然后我不应该解析任何与问题没有直接关系的内容,但处理起来会很好

我得到一个例外:没有找到匹配项

这是因为image2.png与\d+不匹配。假设您要提取image2.png,请使用更合适的模式,如。+

您的正则表达式将是^.*/share/attachments/docs/+$

对于绘图编号2888的ABC结果,绘图编号\\d+$的regexp^.*ABC结果有效,因为字符串末尾有几个连续的数字,而在第一种情况下,image2.png是字母和数字的混合,这就是找不到匹配项的原因

一般来说,为了避免获得IllegalStateException:未找到匹配项,您需要首先检查的结果,如果它返回true,则输入字符串匹配:

我得到一个例外:没有找到匹配项

这是因为image2.png与\d+不匹配。假设您要提取image2.png,请使用更合适的模式,如。+

您的正则表达式将是^.*/share/attachments/docs/+$

对于绘图编号2888的ABC结果,绘图编号\\d+$的regexp^.*ABC结果有效,因为字符串末尾有几个连续的数字,而在第一种情况下,image2.png是字母和数字的混合,这就是找不到匹配项的原因

一般来说,为了避免获得IllegalStateException:未找到匹配项,您需要首先检查的结果,如果它返回true,则输入字符串匹配:

字符串文字中表示为\\d+的正则表达式\d+匹配一个或多个数字的运行。您的示例输入没有相应的数字运行,因此不匹配。正则表达式元字符。匹配任何字符+/-换行符,具体取决于正则表达式选项;看来这才是你真正想要的

此外,当您使用Matcher.find时,模式不需要匹配整个字符串,因此不需要包含。*来匹配前导上下文。此外,find返回一个值,该值告诉您是否找到了与模式匹配的项。您通常希望使用此返回值,在特定情况下,您可以使用它来拒绝那些罕见的不匹配字符串

也许这就是你想要的:

Pattern p = Pattern.compile("/share/attachments/docs/(.+)$");
Matcher m = p.matcher("/share/attachments/docs/image2.png");
String link;

if (m.find()) {
    link = m.group(1);
    System.out.println("Draw #: " + link);
} else {
    link = null;
    System.out.println("Draw #: (not found)");
}
字符串文字中表示为\\d+的正则表达式\d+匹配一个或多个数字的运行。您的示例输入没有相应的数字运行,因此不匹配。正则表达式元字符。匹配任何字符+/-换行符,具体取决于正则表达式选项;看来这才是你真正想要的

此外,当您使用Matcher.find时,模式不需要匹配整个字符串,因此不需要包含。*来匹配前导上下文。此外,find返回一个值,该值告诉您是否找到了与模式匹配的项。您通常希望使用此返回值,在特定情况下,您可以使用它来拒绝那些罕见的不匹配字符串

也许这就是你想要的:

Pattern p = Pattern.compile("/share/attachments/docs/(.+)$");
Matcher m = p.matcher("/share/attachments/docs/image2.png");
String link;

if (m.find()) {
    link = m.group(1);
    System.out.println("Draw #: " + link);
} else {
    link = null;
    System.out.println("Draw #: (not found)");
}

那么您想要得到image2.png吗?可以使用Stringstartswith吗?子表达式\\d+与子字符串image2.png不匹配这一事实到底有什么令人惊讶的地方?正如@JohnBollinger所指出的\\d+用于数值,不是你想要的字符串值。所以你想要得到image2.png?你能使用Stringstartswith吗?子表达式\\d+与子字符串image2.png不匹配这一事实到底有什么令人惊讶的地方?正如@JohnBollinger指出的那样\\d+代表数值,而不是你想要的字符串值。谢谢Nicolas。它起作用了。但如果我的字符串不是以/share/attachments/docs/?开头,我如何确保不会收到异常?我现在测试了一些随机字符串,但它不起作用。。。是否可以使用匹配图案进行检查?感谢您使用的字符串,例如?C:\Users\bvuddavic\Desktop\drugi.xls您可以看到这些基本上是http或磁盘链接,不在默认路径内的所有内容都不应被解析Hanks Nicolas。它起作用了。但如果我的字符串不是以/share/attachments/docs/?开头,我如何确保不会收到异常?我现在测试了一些随机字符串,但它不起作用。。。是否可以使用匹配图案进行检查?感谢您使用的字符串,例如?C:\Users\bvuddavic\Desktop\drugi.xls您可以看到这些基本上都是http或磁盘链接以及所有
不在默认路径内不应该被解析hi John,我测试了您的示例,它可以工作。但是,如果我将Matcher m=p.matcherC:\Users\john.smith\Desktop\image2.jpg;然后它不工作,但抛出异常。这就是我所说的罕见情况,有时是链接桌面计算机上的用户路径,然后我不应该尝试解析字符串!!!你能帮我找到完整答案吗?@Dejan,C:\Users\john.smith\Desktop\image2.jpg不是有效的Java字符串文本。双倍的反斜杠。在您编写时,我可以相信您得到了一个编译错误,但我给出的代码并没有抛出异常。@Dejan,无论如何,根本不尝试解析字符串与检查字符串的形式不一致。如果在不查看其内容的情况下知道该字符串不是应该解析的字符串,那么在这种情况下,不要执行解析该字符串的代码。如果你需要检查字符串来确定它,那就是解析它。嗨,约翰,我测试了你的例子,它工作了。但是,如果我将Matcher m=p.matcherC:\Users\john.smith\Desktop\image2.jpg;然后它不工作,但抛出异常。这就是我所说的罕见情况,有时是链接桌面计算机上的用户路径,然后我不应该尝试解析字符串!!!你能帮我找到完整答案吗?@Dejan,C:\Users\john.smith\Desktop\image2.jpg不是有效的Java字符串文本。双倍的反斜杠。在您编写时,我可以相信您得到了一个编译错误,但我给出的代码并没有抛出异常。@Dejan,无论如何,根本不尝试解析字符串与检查字符串的形式不一致。如果在不查看其内容的情况下知道该字符串不是应该解析的字符串,那么在这种情况下,不要执行解析该字符串的代码。如果您需要检查字符串以确定它,那么这就是解析它。