正则表达式判断一个二位数是否在01-29之间

题目要求:

 

判断一个数是否在01-29之间,我想用正则来写。内容如下:

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String args[]){
        p1();
        p2();
    }
    public static void p1(){
        Pattern p = Pattern.compile("[01-29]");
        Matcher m = p.matcher("21");
        boolean b = m.matches();
        System.out.println(b);//输出false
    }
    public static void p2(){
        Pattern p = Pattern.compile("[a-z]");
        Matcher m = p.matcher("b");
        boolean b = m.matches();
        System.out.println(b);//输出为true
    }
}

  

p2方法输出为 true , 我能理解。

p1方法输出为 false, 我有点糊涂。求教各位大侠。

 

如果想用正则判断一个数字在01-29之间应该怎么写?

 

[quote]Pattern p = Pattern.compile("[01-29]"); [/quote]

这个只能匹配 0或1或2或9 其他均不能匹配。方括号里的代表或者关系,里面的-代表从1到2,所以你这个正则其实是 0|[1-2]|9 .

如果你想匹配的是 01-29 也就是都是两位的那么使用[code="java"]Pattern p = Pattern.compile("[0-2][1-9]|(?:[1-2]0)");[/code]

如果你想匹配的是1-29 那么使用[code="java"]Pattern p = Pattern.compile("[1-9]|(?:[1-2][0-9])");[/code]

如果你想匹配 1-29 也包括01-09 那么使用[code="java"]Pattern p = Pattern.compile("(?:0?[1-9])|(?:[1-2][0-9])")[/code]

注意以上的正则表达式里 ?:可以去掉 ?:在这里代表不记录捕获组(具体什么是捕获组织自己谷歌下)。

这样写

[code="java"]Pattern p = Pattern.compile("[0-2][0-9]");

Matcher m = p.matcher("21");

boolean b = m.matches();

System.out.println(b);[/code]

你的正则写的不对啊Pattern p = Pattern.compile("[0-2][0-9]"); 应该单个的匹配啊

Pattern p = Pattern.compile("0[1-9]|1\d+|2\d+");
Matcher m = p.matcher("21");
boolean b = m.matches();
System.out.println(b);// 输出true

Matcher m2 = p.matcher("00");
boolean b2 = m.matches();
System.out.println(b2);// 输出false

Pattern p = Pattern.compile("0[1-9]|1\d|2\d");
Matcher m = p.matcher("21");
boolean b = m.matches();
System.out.println(b);// 输出true

Matcher m2 = p.matcher("00");
boolean b2 = m.matches();
System.out.println(b2);// 输出false

Pattern p = Pattern.compile("[01-29]")
[]表示选择,("[01-29]")表示在0、1、-、2、9这五个字符中选择一个
可以匹配0、1、-、2、9这五个中的任意一个

Pattern p = Pattern.compile("^012$");
可以匹配01~29中的任意数字
\d表示数字

[code="java"]import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String args[]){
p1();
p2();
}
public static void p1(){
//Pattern p = Pattern.compile("[01-29]");
Pattern p = Pattern.compile("^012$");
Matcher m = p.matcher("12");
boolean b = m.matches();
System.out.println(b);//输出false
}
public static void p2(){
Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher("b");
boolean b = m.matches();
System.out.println(b);//输出为true
}
}[/code]

刚刚上面说错了一点,红色的部分[color=red]

Pattern p = Pattern.compile("[01-29]")
[]表示选择,("[01-29]")表示在0、1、2、9这四个字符中选择一个
可以匹配0、1、2、9这四个中的任意一个 [/color]

Pattern p = Pattern.compile("^012$");
可以匹配01~29中的任意数字
\d表示数字

[code="java"]import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String args[]){
p1();
p2();
}
public static void p1(){
//Pattern p = Pattern.compile("[01-29]");
Pattern p = Pattern.compile("^012$");
Matcher m = p.matcher("12");
boolean b = m.matches();
System.out.println(b);//输出false
}
public static void p2(){
Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher("b");
boolean b = m.matches();
System.out.println(b);//输出为true
}
}[/code]

[color=red]Pattern p = Pattern.compile("(12)|(0[1-9])");
这个可以排除00[/color]

[quote]问题补充:
谢谢您,但是我还有一点不是很明白。
如果我想匹配01-2000怎么写呢?
我觉的正则对连续的数组匹配支持的不好啊。
[/quote]

1、首先正则匹配是字符串或者说是单个字符,你可以看下,其实你在测试的时候给的还是数字类型的字符串。因此当然对这种100-20000的数字支持不好了
2、01-2000如何匹配,我想你那么聪明,看到我的回复在结合相关正则知识应该可以很轻松的写出来吧 :D

提示下,只能1为 2位 3位 的匹配了,没法制定一个数字范围。

[code="java"]
import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Test {

public static void main(String args[]){

p1();

p2();

}

public static void p1(){

Pattern p = Pattern.compile("[0-2][1-9]|[1-2][0]");

Matcher m = p.matcher("21");

boolean b = m.matches();

System.out.println(b);//输出false

}

public static void p2(){

Pattern p = Pattern.compile("[a-z]");

Matcher m = p.matcher("b");

boolean b = m.matches();

System.out.println(b);//输出为true

}

}

[/code]