题目要求:
判断一个数是否在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]