Java 正则表达式检查整数有效性和范围

Java 正则表达式检查整数有效性和范围,java,regex,Java,Regex,我想创建一个正则表达式,它可以帮助我摆脱下面的代码- public class Test { public static void main(String[] args) { String test = "1026"; int testToInt = 0; if(checkIfInteger(test)) testToInt = Integer.parseInt(test); if(testToInt

我想创建一个正则表达式,它可以帮助我摆脱下面的代码-

public class Test {
    public static void main(String[] args) {
        String test = "1026";
        int testToInt = 0;
        if(checkIfInteger(test))
            testToInt = Integer.parseInt(test);
        if(testToInt >= 1024 && testToInt <= 65535)
            System.out.println("Validity is perfect");
        else
            System.out.println("Validity is WRONG");
    }

    public static boolean checkIfInteger(String givenString) {
        boolean check = false;
        for(int i = 0; i < givenString.length(); i++) {
            if(givenString.charAt(i) >= '0' && givenString.charAt(i) >= '9')
                check = true;
            else {
                check = false;
                break;
            }
        }
        return check;
    }
}
但是有很多价值观是失败的。有人能给我一个更聪明/正确的方法吗

如果你想测试你的正则表达式,这里有一个测试文件-

public class Test {
    public static void main(String[] args) {

        for (int i = 0; i < 1024; i++) {
            if (String
                    .valueOf(i)
                    .matches(
                            "\b(102[4-9]|10[3-9][0-9]|1[1-9][0-9]{2}|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[01][0-9]|6552[0-5])\b"))
                System.out.println("Hum " + i);
        }


        for (int i = 1025; i < (int) Math.pow(2, 16); i++) {
            if (!String
                    .valueOf(i)
                    .matches(
                            "\b(102[4-9]|10[3-9][0-9]|1[1-9][0-9]{2}|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[01][0-9]|6552[0-5])\b"))
                System.out.println("Hum " + i);
        }

        for (int i = 0; i < 100; i++) {
            if (String
                    .valueOf((int)Math.pow(2, 16) + i)
                    .matches(
                            "\b(102[4-9]|10[3-9][0-9]|1[1-9][0-9]{2}|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[01][0-9]|6552[0-5])\b"))
                System.out.println("Hum " + i);
        }

    }
}
公共类测试{
公共静态void main(字符串[]args){
对于(int i=0;i<1024;i++){
如果(字符串)
.第(i)款的价值
.火柴(
“\b(102[4-9]| 10[3-9][0-9]| 1[1-9][0-9]{2}[2-9][0-9]{3}[1-5][0-9]{4}6[0-4][0-9]{3}| 65[0-4][0-9]{2}655[01][0-9][0-9]{6552[0-5])\b”))
System.out.println(“Hum”+i);
}
对于(int i=1025;i<(int)Math.pow(2,16);i++){
如果(!字符串)
.第(i)款的价值
.火柴(
“\b(102[4-9]| 10[3-9][0-9]| 1[1-9][0-9]{2}[2-9][0-9]{3}[1-5][0-9]{4}6[0-4][0-9]{3}| 65[0-4][0-9]{2}655[01][0-9][0-9]{6552[0-5])\b”))
System.out.println(“Hum”+i);
}
对于(int i=0;i<100;i++){
如果(字符串)
.valueOf((int)数学功率(2,16)+i)
.火柴(
“\b(102[4-9]| 10[3-9][0-9]| 1[1-9][0-9]{2}[2-9][0-9]{3}[1-5][0-9]{4}6[0-4][0-9]{3}| 65[0-4][0-9]{2}655[01][0-9][0-9]{6552[0-5])\b”))
System.out.println(“Hum”+i);
}
}
}

在Java中,您需要使用双转义符号,因此在修复此位后,您的正则表达式字符串如下所示:

String pattern = "\\b(102[4-9]|10[3-9][0-9]|1[1-9][0-9]{2}|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[01][0-9]|6552[0-5])\\b";
这已经解决了很多问题,我只得到这些“哼哼”:

现在,添加
| 6553[0-5]
我得到了一个完全工作的正则表达式:

String pattern = "\\b(102[4-9]|10[3-9][0-9]|1[1-9][0-9]{2}|[2-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[012][0-9]|6552[0-5]|6553[0-5])\\b";

在这里,

抛出
异常
比返回布尔值是更好的策略

比如:

public int parseAndCheck(String val, int low, int high) throws IllegalArgumentException {
  try {
    int num = Integer.parseInt(val);
    if (num < low || num > high) throw new IllegalArgumentException(val);
    return num;
  }
  catch (NumberFormatException ex) {
    throw new IllegalArgumentException(ex);
  }
}
public int-parseAndCheck(字符串val、int-low、int-high)抛出IllegalArgumentException{
试一试{
int num=Integer.parseInt(val);
如果(numhigh)抛出新的IllegalArgumentException(val);
返回num;
}
捕获(NumberFormatException ex){
抛出新的IllegalArgumentException(ex);
}
}
更改您的代码

发件人:

 testToInt = Integer.parseInt(test);
        if(testToInt >= 1024 && testToInt <= 65535)
            System.out.println("Validity is perfect");
        else
            System.out.println("Validity is WRONG");
try {
      testToInt = Integer.parseInt(test);
     if(testToInt >= 1024 && testToInt <= 65535)
        System.out.println("Validity is perfect");
    else
        System.out.println("Validity is WRONG");
    }  
      catch(NumberFormatException nfe)  
   {  
      System.out.println("Validity is WRONG"); 
   }  
testToInt=Integer.parseInt(测试);
如果(testToInt>=1024&&testToInt=1024&&testToInt)
你可以试试这个正则表达式。见演示


仅仅因为你可以用正则表达式来实现这一点并不意味着你就应该这样做。这不仅容易出错,而且代码几乎不可读,而且速度相当慢

给定代码如下:

var intStrings=IntStream.range(07000).mapToObj(Integer::toString).toArray(String[]::new);
var badStrings=IntStream.range(07000).mapToObj(x->“非整数”+x).toArray(字符串[]:::新);
并从以下位置使用regexp:

var re=Pattern.compile(\\b(102[4-9]| 10[3-9][0-9]| 1[1-9][0-9]{2}|[2-9][0-9]{3}|[1-5][0-9]{4}6[0-4][0-9]{3}65[0-4][0-4][0-9]{2}655[012 0-9][0-9]{6552[0-5];
var-matchCount=0;
对于(inti=0,len=intStrings.length;i
与字符检查版本的相同迭代次数相比,需要大约12倍的时间:

布尔值有效(字符串s){
var len=s.length();
如果(len>5){//任何比这更长的值都将>65535
返回false;
}
对于(int i=0;i'9'){
返回false;
}
}
试一试{
var intVal=Integer.parseInt(s);

return intVal>=1024&&intVal=1024&&intVal只是想知道-您现在拥有的代码有什么问题?更聪明的方法:不要使用正则表达式…?直接使用
Integer.parseInt()
方法有什么问题,而不需要先测试?(当然,捕获可能抛出的
NumberFormatException
)嗯,这总是有效的,但我只是好奇我是否能找到一个正则表达式来代替它所做的一切:)。很好development@halex是的,有了如此详尽的测试,它肯定会发生:P thanx:)
 testToInt = Integer.parseInt(test);
        if(testToInt >= 1024 && testToInt <= 65535)
            System.out.println("Validity is perfect");
        else
            System.out.println("Validity is WRONG");
try {
      testToInt = Integer.parseInt(test);
     if(testToInt >= 1024 && testToInt <= 65535)
        System.out.println("Validity is perfect");
    else
        System.out.println("Validity is WRONG");
    }  
      catch(NumberFormatException nfe)  
   {  
      System.out.println("Validity is WRONG"); 
   }  
^(?:102[4-9]|10[3-9]\d|1[1-9]\d{2}|[2-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$