Java 字符串中数字范围的高级解析
我使用Java解析用户输入的字符串,表示单个数值或范围。用户可以输入以下字符串:Java 字符串中数字范围的高级解析,java,regex,Java,Regex,我使用Java解析用户输入的字符串,表示单个数值或范围。用户可以输入以下字符串: 10-19 他的意图是使用10-19-->10,11,12…19 用户还可以指定数字列表: 10,15,19 或上述各项的组合: 10-19,25,33 是否有一种可能基于正则表达式的方便方法来执行此解析?或者我必须使用string.split()拆分字符串,然后手动迭代特殊符号(“,”和“-”),在这种情况下?我将这样做: 使用,作为分隔符进行拆分 如果它匹配以下正则表达式:^(\\d+)-(\\d+)$,
10-19
他的意图是使用10-19
-->10,11,12…19
用户还可以指定数字列表:
10,15,19
或上述各项的组合:
10-19,25,33
是否有一种可能基于正则表达式的方便方法来执行此解析?或者我必须使用
string.split()
拆分字符串,然后手动迭代特殊符号(“,”和“-”),在这种情况下?我将这样做:
,
作为分隔符进行拆分^(\\d+)-(\\d+)$
,则我知道我有一个范围。然后我将提取数字并创建我的范围(最好确保第一个数字低于第二个数字,因为你永远不知道……)。然后你相应地采取行动^\\d+$
我就知道我只有一个数字,所以我有一个特定的页面。然后我将据此采取行动在最简单的方法中,您可以使用evil
eval
进行此操作
A = eval('[10:19,25,33]')
A =
10 11 12 13 14 15 16 17 18 19 25 33
但是当然你在做那件事之前应该三思而后行。特别是如果这是用户提供的字符串!想象一下如果用户提供了任何其他命令会发生什么
eval('!rm -rf /')
你必须确保除了你想要的东西之外没有别的东西。您可以通过使用
strinput = '10-19,25,33'
eval(cat(2,'[',strrep(strinput,'-',':'),']'))
最好是包括一些输入检查,负数也会给这个方法带来问题。这个经过测试(并完全注释)的正则表达式解决方案满足OP要求:
Java正则表达式解决方案
//TEST.java 20121024\u 0700
导入java.util.regex.*;
公开课考试{
公共静态布尔值isValidIntRangeInput(字符串文本){
Pattern re_valid=Pattern.compile(
“#验证逗号分隔的整数/整数范围。\n”+
“^#锚定到字符串的开头。\n”+
“[0-9]+#第一个值的整数(必需)。\n”+
(?:#第一个值的范围(可选)。\n+
-#破折号分隔范围整数。\n+
[0-9]+#第一个值的范围整数。\n+
“”?#第一个值的范围(可选)。\n“+
(?:#零个或多个附加值。\n+
“,#逗号分隔其他值。\n”+
“[0-9]+#额外值的整数(必需)。\n”+
(?:#额外值的范围(可选)。\n+
-#破折号分隔范围整数。\n+
“[0-9]+#额外值的范围整数。\n”+
“”?#额外值的范围(可选)。\n“+
“”*#零个或多个附加值。\n“+
“$#锚定到字符串末尾。”,
(b)评论);
Matcher m=re_valid.Matcher(文本);
如果(m.matches())返回true;
否则返回false;
}
公共静态void打印内部消息(字符串文本){
Pattern re_next_val=Pattern.compile(
“#提取下一个整数/整数范围值。\n”+
“([0-9]+)#$1:第一个整数(基数)。\n”+
(?:#值的范围(可选)。\n+
-#破折号分隔范围整数。\n+
“([0-9]+)#$2:第二个整数(范围)\n”+
“”?#值的范围(可选)。\n“+
“(?:,|$)#以逗号结尾或字符串结尾。”,
(b)评论);
匹配器m=重新设置下一个值匹配器(文本);
串味精;
int i=0;
while(m.find()){
msg=“value[”+++i+“]ibase=“+m.group(1);
如果(m.group(2)!=null){
msg+=“range=”+m.group(2);
};
System.out.println(msg);
}
}
公共静态void main(字符串[]args){
字符串[]arr=新字符串[]
{//有效输入:
"1",
"1,2,3",
"1-9",
"1-9,10-19,20-199",
"1-8,9,10-18,19,20-199",
//无效输入:
“A”,
"1,2,",
"1 - 9",
" ",
""
};
//循环所有测试输入字符串:
int i=0;
用于(字符串s:arr){
String msg=“String[“+++i+”]=\”“+s+”\“is”;
如果(是有效的传输输入){
//有效输入行
System.out.println(msg+“有效输入.解析…”);
打印内部网页;
}否则{
//匹配尝试失败
System.out.println(消息+“无效输入”);
}
}
}
}
输出:
r''
字符串[1]=“1”是有效输入。解析。。。
值[1]ibase=1
字符串[2]=“1,2,3”是有效输入。解析。。。
值[1]ibase=1
值[2]ibase=2
值[3]ibase=3
字符串[3]=“1-9”是有效输入。解析。。。
值[1]ibase=1范围=9
字符串[4]=“1-9,10-19,20-199”为有效输入。解析。。。
值[1]ibase=1范围=9
值[2]ibase=10范围=19
值[3]ibase=20范围=199
字符串[5]=“1-8,9,10-18,19,20-199”是有效输入。解析。。。
值[1]ibase=1范围=8
值[2]ibase=9
值[3]ibase=10范围=18
值[4]ibase=19
值[5]ibase=20范围=199
字符串[6]=“A”不是有效的输入。
字符串[7]=“1,2”不是有效的输入。
字符串[8]=“1-9”不是有效的输入。
字符串[9]=“”不是有效的输入。
字符串[10]=“”不是有效的输入。
'''
请注意,此解决方案只是演示