正则表达式(regular expression)描述了一种字符串的匹配模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式可以用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符:
【ABC】匹配【...】中所有字符。
【^ABC】匹配除了【...】中字符的所有字符。
【A-Z】表示一个匹配区间。
\w 匹配字母、数字、下划线。
非打印字符:
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。
\f 匹配一个换页符。 \n 匹配一个换行符。
\r 匹配一个回车符。 \s匹配任何空白字符。
\S 匹配任何非空白字符。
\t 匹配一个制表符。 \v 匹配一个垂直制表符。
特殊字符:
有特殊含义的字符。
$ 匹配输入字符串的结尾位置。
()标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
* 匹配前面子表达式零次和多次。
+ 匹配前面子表达式一次或多次。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
^ 匹配输入字符串的开始位置。
{ 标记限定字符表达式的开始。
| 指明两项之间的一个选择。
限定符:
* ,+,?
{n} n是一个非负整数。匹配确定的n次。例如,o{2}不能匹配“Bob”中的“o”,但是能匹配“food”中的两个“o”。
{n,}n是一个非负整数。至少匹配n次。
{n,m} n<=m。“o{1,3}”将匹配“foooood”中的前三个o。
定位符:
^ ,$,
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。
注意:不能将限定符与定位符一起使用。
例子:
匹配1~99的正整数表达式:/[1-9][0-9]?/ 或 /[1-9][0-9]{0,1}/
* 和 +限定符都是贪婪的,它们会尽可能多的匹配文字,只要在它们后面加上一个?就可以实现非贪婪或最小匹配。
捕获组:
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
下面的例子说明如何从一个给定的字符串中找到数字串:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String[] args ){
// 按指定模式在字符串查找
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
System.out.println("Found value: " + m.group(3) );
}
else {
System.out.println("NO MATCH");
}
}
}
匹配重复的单词。
\b(\w+)\s+\1\b
以下正则表达式允许您找到“标题”单词,以防其在新行中开始。
(\n\s*)title
下面是正则表达式的简单使用:
1、Test01.java :使用正则表达式使代码变得非常简洁。
1 package test_regex; 2 public class Test01 { 3 public static void main(String[] args){ 4 String str = "1234567"; 5 // char[] c = str.toCharArray(); 6 // boolean b = true; 7 // for(char c1:c){ 8 // if(!(c1>='0'&&c1<='9')){ 9 // b = false; 10 // break; 11 // } 12 // } 13 // System.out.println(b); 14 15 String regex = "\\d+"; 16 System.out.println(str.matches(regex)); 17 } 18 }
2、TestMatcher01.java(Matcher类的使用,用于字符串的验证)
1 package test_regex; 2 import java.util.regex.Pattern; 3 import java.util.regex.Matcher; 4 public class TestMatcher01 { 5 public static void main(String[] args){ 6 String str = "1234567abc"; 7 String regex = "\\w{10,}"; 8 // Pattern pat = Pattern.compile(regex); 9 // Matcher mat = pat.matcher(str); 10 // System.out.println(mat.matches()); 11 System.out.println(str.matches(regex)); 12 } 13 }
3、TestMatcher02.java(Matcher类的使用,用于字符串的替换)
1 package test_regex; 2 import java.util.regex.Pattern; 3 import java.util.regex.Matcher; 4 public class TestMatcher02 { 5 public static void main(String[] args){ 6 String str = "12Y34h56dAd7"; 7 String regex = "[a-zA-Z]+"; 8 // Pattern pat = Pattern.compile(regex); 9 // Matcher mat = pat.matcher(str); 10 // System.out.println(mat.replaceAll(":")); 11 System.out.println(str.replaceAll(regex,"-")); 12 } 13 }
4、TestPattern01.java(Pattern类的使用,用于字符串的拆分)
1 package test_regex; 2 import java.util.regex.Pattern; 3 public class TestPattern01 { 4 public static void main(String[] args){ 5 String str = "Tom:30|Jerry:20|Bob:25"; 6 String regex = "\\|"; 7 // Pattern pat = Pattern.compile(regex); 8 // String[] arr = pat.split(str); 9 String[] arr = str.split(regex); 10 for(String s:arr){ 11 System.out.println(s); 12 } 13 } 14 }
5、TestRegex01.java(大概判断一个邮箱地址是否合法)
1 package test_regex; 2 public class TestRegex01 { 3 //判断一个邮箱地址是否合法 4 public static void main(String[] args){ 5 //这里默认邮箱的后缀是.com或.net.cn 6 String str = "aa@aa.net.cn"; 7 String regex = "\\w+@\\w+\\.(com|net.cn)"; 8 System.out.println(str.matches(regex)); 9 } 10 }