正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
    正则表达式的特点是:
  3. 灵活性、逻辑性和功能性非常的强;
  4. 可以迅速地用极简单的方式达到字符串的复杂控制。
  5. 对于刚接触的人来说,比较晦涩难懂。
    由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。

基本语法

元字符

语法 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

反义

语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

重复

语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

方括号集合

如[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)
如[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w

分支条件

正则表达式里的分支条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
如:0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。

分组

正则可以用小括号来指定子表达式(也叫做分组)
如用正则表达式(\d{3}).(\w{3})来匹配123.abc
分组之后:
$0来代表整个匹配如123.abc
$1来代表第1个括号的匹配如123
$2来代表第2个括号的匹配如abc

如果要将分组匹配的内容在后面的表达用\编号和代替
如:用(\w+)\s+\1 来匹配重复的单词如go go

后向引用

分类 语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
捕获 (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
捕获 (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
零宽断言 (?<=exp) 匹配exp后面的位置
零宽断言 (?!exp) 匹配后面跟的不是exp的位置
零宽断言 (?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

举个栗子

正则表达式截取字符串

1
2
3
4
5
6
String str = " 101 @achi 200 @a低碳阴谋:中国与欧美的生死之战@ADI TAN LIN MOU@f勾红洋著 210 @a太原@c山西经济出版社 690 @aX511@v4";
String regex = "(?<= )([.]*)(?= \\d{3})";
String[] strs = str.split(regex);
for(int i = 0; i < strs. length; i++) {
System. out.printf( "%s%n", strs[i]);
}

打印结果为:
101 @achi
200 @a低碳阴谋:中国与欧美的生死之战@ADI TAN LIN MOU@f勾红洋著
210 @a太原@c山西经济出版社
690 @aX511@v4

正则截图根host

1
2
3
4
5
6
7
8
9
10
String host="mms.dinpay.loc";
String host2="dinpay.loc";
String host3="eee.rr.dinpay.loc";
String host4=".dinpay.loc";
Pattern p=Pattern.compile("\\.?(\\w+\\.\\w+)$");
Matcher m=p.matcher(host4);
if(m.find()){
host=m.group(1);
}
System.out.println(host);

匹配结果为dinpay.loc

正则获取host

1
2
3
4
5
6
7
8
String reg="(?<=^).*\\.(?=\\w+\\.((com(\\.cn)?)|(?<!com\\.)cn|net)$)";
System.out.println("5.aaa.com".replaceAll(reg, ""));
System.out.println("a.b.ccc.com".replaceAll(reg, ""));
System.out.println("567.com.cn".replaceAll(reg, ""));
System.out.println("youku.net".replaceAll(reg, ""));
System.out.println("youku.cn".replaceAll(reg, ""));
System.out.println("555.youku.cn".replaceAll(reg, ""));
System.out.println("11.youku.net".replaceAll(reg, ""));

打印结果为:
aaa.com
ccc.com
567.com.cn
youku.net
youku.cn
youku.cn
youku.net