导语
所有的开发一定要有正则的支持。
主要内容
- 记下常用的正则标记
- 掌握String类对正则的支持
具体内容
问题引出
为了更好的说明正则的应用,下面要求编写一个程序:判断一个字符串是否由数字所组成。
实现原理:
- 将字符串变为字符数组。
- 而后判断每一个字符是否在“‘0’~‘9’”范围之间。
范例:实现字符串的判断
public class TestDemo {
public static void main(String args[]) {
String str1 = "123";
System.out.println(isNumber(str1));
String str2 = "1a23";
System.out.println(isNumber(str2));
}
public static boolean isNumber(String temp) {
char data [] = temp.toCharArray(); // 将字符串变为字符数组,目的是循环取出
for(int i = 0; i < data.length; i++) {
if(data[i] > '9' || data[i] < '0') {
return false;
}
}
return true;
}
}
输出结果
true
false
此时判断字符串是否由数字所组成,是一个很容易实现的功能,但是就这样一个简短的操作,却写出了八行代码,那么如果说现在是更加复杂的操作呢?
范例:更简单的做法
public class TestDemo {
public static void main(String args[]) {
String str1 = "123";
System.out.println(str1.matches("\\d+"));
String str2 = "1a23";
System.out.println(str2.matches("\\d+"));
}
}
输出结果
true
false
一个写了很多行的代码,最后只是写了一行简单的操作就实现了,而其中出现的"\d+"就是正则表达式。
正则是从JDK1.4的时候正式引入到java中的工具类,所有正则支持的类都定义在java.util.regex包里面。在JDK1.4之前,如果想要使用正则,则需要单独下载一个正则表达式的开发包后才可以使用。
在java.util.regex包里面主要定义了两个主要的类:
- Pattem类:此类对象如果要想取得必须使用compile()方法,方法的功能是编译正则。
- Matcher类:通过Pattem类取得。
正则标记(背会)
所有的正则可以使用的标记都在java.util.regex.Pattem类里面定义。
- 单个字符(数量:1)。
- 字符:表示由一位字符所组成:"x"
- \:表示转义字符“\”。
- \t:表示一个“\t”符号。
- \n:匹配换行“\n”符号。
- 字符集(数量:1).
- [abc]:表示可能是字符a或者是字符b或者是字符c中的任意一位。
- [^abc]:表示不是a、b、c中的任意一位。
- [a-z]:所有的小写字母。
- [a-zA-Z]:所有的字母(不区分大小写)。
- [0-9]:任意一位数字。
- 简化的字符集表达式(数量:1)。
- .:表示任意的一位字符。
- \d:等价与“[0-9]”,属于简化写法。
- \D:等价与“[^0-9]”,也属于简化写法。
- \s:表示任意的空白字符,例如:“\t”、“\n”。
- \S:表示任意的非空白字符。
- \w:等价于“[a-zA-Z_0-9]”,表示由任意的字母、数字、_所组成。
- \W:等价于“[^a-zA-Z_0-9]”,表示不是由任意的字母、数字、_所组成。
- 边界匹配(不要在java中使用,在JavaScript里使用)。
- ^:正则的开始。
- $:正则的结束。
- 数量表达式
- 正则?:表示此正则可以出现0次或1次。
- 正则+:表示此正则可以出现1次或1次以上。
- 正则*:表示此正则可以出现0次、1次或多次。
- 正则{n}:表示此正则正好出现n次。
- 正则{n,}:表示此正则出现n次及以上(包含n次)。
- 正则{n,m}:表示此正则出现n次~m次。
- 逻辑运算。
- 正则1 正则2:正则1判断完成之后继续判断正则2。
- 正则1 | 正则2:正则1或者是正则2有一组满足即可。
- (正则):将多个正则作为一组,可以为这一组单独设置出现的次数。
范例:使用正则表达式
public class TestDemo {
public static void main(String args[]) {
String str = "a";
System.out.println(str.matches("a")); // true
System.out.println(str.matches("b")); // false
System.out.println(str.matches("[abc]")); // true
System.out.println(str.matches("[xyz]")); // false
System.out.println(str.matches("[^abc]")); // false
System.out.println(str.matches("[^xyz]")); // true
System.out.println(str.matches("[a-z]")); // true
System.out.println(str.matches("[A-Z]")); // false
str = "123";
System.out.println(str.matches("\\d")); // false
System.out.println(str.matches("\\d+")); // true
}
}
输出结果
true
false
true
false
false
true
true
false
false
true
String类对正则的支持(重点)
在JDK1.4之后,由于正则的引入,所以String类里面也相应的增加了新的操作方法支持:
- public boolean matches(String regex):正则验证,使用指定的字符串判断其是否符合给出的正则表达式结构。
- public String replaceAll(String regex, String replacement):全部替换。
- public String replaceFirstl(String regex, String replacement):替换首个。
- public String[] split(String regex):全部拆分。
- public String[] split(String regex, int limit):部分拆分。
范例:实现字符串的替换
public class TestDemo {
public static void main(String args[]) {
String str = "klslkasjfALFJfiwq029342()*$;klja#AD";
String regex = "[^a-z]"; // 此处编写正则
System.out.println(str.replaceAll(regex, ""));
}
}
输出结果
klslkasjffiwqklja
范例:实现字符串的拆分
public class TestDemo {
public static void main(String args[]) {
String str = "kj8LK89ssL8798KLLKlkllk5555ww";
String regex = "\\d+"; // [0-9]
String result [] = str.split(regex);
for(int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
}
输出结果
kj
LK
ssL
KLLKlkllk
ww
所有正则之中最应该引起我们兴奋的事情是因为可以使用它进行验证。
范例:验证一个字符串是否是数值
public class TestDemo {
public static void main(String args[]) {
String str = "10.2";
String regex = "\\d+(\\.\\d+)?";
System.out.println(str.matches(regex));
}
}
输出结果
true
范例:验证一个字符串是否是邮箱
public class TestDemo {
public static void main(String args[]) {
String str = "hello.nihao123_123@mldn.com.cn";
String regex = "[a-zA-Z][a-zA-Z0-9_\\.]{0,28}[a-zA-Z0-9]@\\w+\\.(net|cn|com|com\\.cn|org|gov|edu)";
System.out.println(str.matches(regex));
}
}
输出结果
true
java.util.regex包支持
在大多数情况下使用正则的时候都会采用String类完成,但是正则最原始的开发包是java.util.regex,这个包里也提供有两个类。
范例:Pattem类
public class TestDemo {
public static void main(String args[]) {
String str = "a1b22c333d4444e55555";
String regex = "\\d+";
Pattern pattren = Pattern.compile(regex); // 编译正则
String result [] = pattern.split(str); // 拆分字符串
System.out.println(Arrays.toString(result));
}
}
输出结果
[a,b,c,d,e]
public class TestDemo {
public static void main(String args[]) {
String str = "24123";
String regex = "\\d+";
Pattern pattren = Pattern.compile(regex); // 编译正则
Matcher mat = pattern.matcher(str); // 进行正则匹配
System.out.println(mat.matches()); // 匹配结果
}
}
输出结果
true
因为String类本身就已经支持这样的操作了,所以对于String类而言由于所有接收的数据也都是字符串,所以很少会去利用Pattem与Matcher两个类进行操作了。
总结
- 利用正则实现验证代码可以最少化。
- 一定要清楚String类对正则支持的几个方法。