Java 使用模式匹配器的正则表达式没有正确返回?
Java regex using pattern matcher not returning correctly?
我必须从以下字符串中获取索引值:
Home.number[12].parent.
我想取回值 12。
这是我尝试过的:
//escape . / [ ]
private static final String pattern = "Home\.number\[([0-9]*)\]*";
private static final Pattern addressPattern = Pattern.compile(pattern);
private static int getIndex(String input, Pattern pattern){
Matcher m = pattern.matcher(input);
if (m.matches()){
return Integer.valueOf(m.group(2));
}
return -1;
}
public static void main(String[] args){
System.out.println(getIndex("Home.number[123].parent", addressPattern);
System.out.println(getIndex("Home.number[456].child", addressPattern);
}
我返回 -1
两个,这意味着没有找到匹配项。
使用调试器,我发现 m.matches()
正在返回 false
。
我想不通为什么。
P.S:我也尝试过使用 Pattern.quote("Home.number[([0-9]*])*")
和 StringUtils.EscapeJava("Home.number[([0-9]*)]*")
。两者均未返回任何匹配结果。
- 将模式从:
"Home\.number\[([0-9]*)\]*"
更改为 "Home\.number\[([0-9]+)\].*"
(在最后一个 *
之前添加点)
- 将组更改为 #1:
return Integer.valueOf(m.group(1));
- 在
System.out.println()
调用中添加右括号。
像这样:
private static final String pattern = "Home\.number\[([0-9]*)\].*";
private static final Pattern addressPattern = Pattern.compile(pattern);
private static int getIndex(String input, Pattern pattern){
Matcher m = pattern.matcher(input);
if (m.matches()){
return Integer.valueOf(m.group(1));
}
return -1;
}
public static void main( String[] args ){
System.out.println(getIndex("Home.number[123].parent", addressPattern));
System.out.println(getIndex("Home.number[456].child", addressPattern));
}
你的Pattern
应该看起来像
private static final String pattern = "Home\.number\[(\d+)\]\..*";
private static final Pattern addressPattern = Pattern.compile(pattern);
而你的匹配器只有 1
个组。
private static int getIndex(String input, Pattern pattern) {
Matcher m = pattern.matcher(input);
if (m.matches()) {
return Integer.parseInt(m.group(1));
}
return -1;
}
并且您需要在 main
的调用中关闭第二个括号。像
public static void main(String[] args) {
System.out.println(getIndex("Home.number[123].parent", addressPattern));
System.out.println(getIndex("Home.number[456].child", addressPattern));
}
当我进行这些更改时,我得到了预期的结果
123
456
如果你删除除了方括号之间的所有内容,你可以在一行中完成:
private static int getIndex(String input) {
return input.matches(".*\[\d+].*") ? -1 : Integer.parseInt(input.replaceAll(".*\[|].*", ""));
}
我必须从以下字符串中获取索引值:
Home.number[12].parent.
我想取回值 12。
这是我尝试过的:
//escape . / [ ]
private static final String pattern = "Home\.number\[([0-9]*)\]*";
private static final Pattern addressPattern = Pattern.compile(pattern);
private static int getIndex(String input, Pattern pattern){
Matcher m = pattern.matcher(input);
if (m.matches()){
return Integer.valueOf(m.group(2));
}
return -1;
}
public static void main(String[] args){
System.out.println(getIndex("Home.number[123].parent", addressPattern);
System.out.println(getIndex("Home.number[456].child", addressPattern);
}
我返回 -1
两个,这意味着没有找到匹配项。
使用调试器,我发现 m.matches()
正在返回 false
。
我想不通为什么。
P.S:我也尝试过使用 Pattern.quote("Home.number[([0-9]*])*")
和 StringUtils.EscapeJava("Home.number[([0-9]*)]*")
。两者均未返回任何匹配结果。
- 将模式从:
"Home\.number\[([0-9]*)\]*"
更改为"Home\.number\[([0-9]+)\].*"
(在最后一个*
之前添加点) - 将组更改为 #1:
return Integer.valueOf(m.group(1));
- 在
System.out.println()
调用中添加右括号。
像这样:
private static final String pattern = "Home\.number\[([0-9]*)\].*";
private static final Pattern addressPattern = Pattern.compile(pattern);
private static int getIndex(String input, Pattern pattern){
Matcher m = pattern.matcher(input);
if (m.matches()){
return Integer.valueOf(m.group(1));
}
return -1;
}
public static void main( String[] args ){
System.out.println(getIndex("Home.number[123].parent", addressPattern));
System.out.println(getIndex("Home.number[456].child", addressPattern));
}
你的Pattern
应该看起来像
private static final String pattern = "Home\.number\[(\d+)\]\..*";
private static final Pattern addressPattern = Pattern.compile(pattern);
而你的匹配器只有 1
个组。
private static int getIndex(String input, Pattern pattern) {
Matcher m = pattern.matcher(input);
if (m.matches()) {
return Integer.parseInt(m.group(1));
}
return -1;
}
并且您需要在 main
的调用中关闭第二个括号。像
public static void main(String[] args) {
System.out.println(getIndex("Home.number[123].parent", addressPattern));
System.out.println(getIndex("Home.number[456].child", addressPattern));
}
当我进行这些更改时,我得到了预期的结果
123
456
如果你删除除了方括号之间的所有内容,你可以在一行中完成:
private static int getIndex(String input) {
return input.matches(".*\[\d+].*") ? -1 : Integer.parseInt(input.replaceAll(".*\[|].*", ""));
}