Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串中数字范围的高级解析_Java_Regex - Fatal编程技术网

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+)$,

我使用Java解析用户输入的字符串,表示单个数值或范围。用户可以输入以下字符串:

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]=“”不是有效的输入。
    '''
    
    请注意,此解决方案只是演示