Java 匹配器模式问题

标签 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/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/ 开头,然后我不应该解析任何东西,但这与问题没有直接关系,但处理起来会很好。

最佳答案

I am getting Exception that: No match found.

这是因为 image2.png\d+ 不匹配使用更合适的模式如 .+ 假设你想提取image2.png

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


ABC Results for draw no 2888 的情况下,正则表达式 ^(.*)ABC Results for draw no (\\d+)$ 有效,因为您有多个String 末尾的连续数字,而在第一种情况下,您的 image2.png 是字母和数字的混合,这就是找不到匹配项的原因.


一般来说,要避免出现IllegalStateException: No match found,您需要先检查find() 的结果。 ,如果它返回 true 输入 String 匹配:

if (m.find()) {
   // The String matches with the pattern
   String link = m.group(2);    
   System.out.println("Draw #: "+link);
}  else {
   System.out.println("Input value doesn't match with the pattern");
}

关于Java 匹配器模式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39621485/

相关文章:

haskell - 如何比较字符与 Haskell 中的数字?

java - 计算文本之间相似度的算法

java - 使用 Jackson 解析 JSON 数组,其中对象是字符串?

java - 为什么我的 Java gui 会调整标签大小?

pattern-matching - Antlr 树模式匹配与重写规则

haskell - 这如何 getRight::要么 a b -> 也许 b 工作?

java - 匹配器的问题

具有固定开始和重复 block 的字符串的Java正则表达式

java - Pattern::asPredicate 线程安全吗

java - 使用java的getClasses()方法