我必须从以下字符串中获取索引值:
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]*)]*")
。
您的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
- 将模式从:
"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));
}
如果您删除除方括号之间的所有内容,则可以在一行中完成:
private static int getIndex(String input) {
return input.matches(".*\[\d+].*") ? -1 : Integer.parseInt(input.replaceAll(".*\[|].*", ""));
}