Java 匹配器模式问题
Java Matcher Pattern issue
我正在尝试提取此字符串路径 /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);
但我得到异常:No match found.
奇怪,因为如果我使用这个:
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()
的结果,如果 returns 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");
}
正则表达式 \d+
(在字符串文字中表示为 \d+
)匹配一个或多个 数字 的 运行。您的示例输入没有对应的数字 运行,因此不匹配。正则表达式元字符 .
匹配 any 字符(+/- 换行符,取决于正则表达式选项);看起来这可能就是您真正想要的。
此外,当您使用 Matcher.find()
时,模式不需要匹配整个字符串,因此不需要包含 .*
来匹配前导上下文。此外,find()
return 是一个值,告诉您是否找到了与模式的匹配项。您通常希望使用此 return 值,在您的特定情况下,您可以使用它来拒绝那些罕见的不匹配字符串。
也许这更符合您的要求:
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)");
}
我正在尝试提取此字符串路径 /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);
但我得到异常:No match found.
奇怪,因为如果我使用这个:
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()
的结果,如果 returns 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");
}
正则表达式 \d+
(在字符串文字中表示为 \d+
)匹配一个或多个 数字 的 运行。您的示例输入没有对应的数字 运行,因此不匹配。正则表达式元字符 .
匹配 any 字符(+/- 换行符,取决于正则表达式选项);看起来这可能就是您真正想要的。
此外,当您使用 Matcher.find()
时,模式不需要匹配整个字符串,因此不需要包含 .*
来匹配前导上下文。此外,find()
return 是一个值,告诉您是否找到了与模式的匹配项。您通常希望使用此 return 值,在您的特定情况下,您可以使用它来拒绝那些罕见的不匹配字符串。
也许这更符合您的要求:
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)");
}