正则表达式

正则表达式(Regular Expression),使用模式(Pattern)对文本内容进行匹配(Match),并可以进一步操作,如提取、替换文本内容等。JDK中的正则表达式处理资源定义在java.util.regex包,代码文件中注意导入。

模式

匹配特定的字符时,可以将模式定义在一对方括号中,以下转义字符表示特定类型的字符:

  • \w,单词字符,大小写英文字母、数字和下画线。
  • \W,单词字符以外的字符。
  • \s,空白字符。
  • \S,非空白字符。
  • \d,数字。
  • \D,数字以外的内容。

在字符串中使用\转义时应注意,由于在Java字符串中,\符号同样需要转义,所以,在正则表达式的模式中就需要两个\符号,如\\w。

此外,在方括号中还可以使用连字符(-)指定范围,如[0-9]表示0到9的数字,[a-z]表示小写字母a到z。下面的代码,将匹配字符串的小写字母。

Java
import java.util.regex.*;
public class Hello {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("[a-z]");
        String s = "aB986ieA64Kdfh";
        Matcher m = p.matcher(s);
        while(m.find()) {
	        System.out.println(m.group());
        }
	}
}

代码会显示s字符串中的所有小写字母,执行结果如下图。

如果需要匹配指定规则以外的字符,可以在[]中的最前面添加^符号,如下面的代码会显示除大小字母以外的内容。

Java
import java.util.regex.*;
public class Hello {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("[^a-zA-Z]");
        String s = "aB986i,eA6*4Kdfh";
        Matcher m = p.matcher(s);
        while(m.find()) {
	        System.out.println(m.group());
        }
	}
}

代码执行结果如下图。

对于连接的内容,可以直接书写,但对于一些特殊字符,同样需要转义,如:

  • \t,制表符。
  • \n,换行符。
  • \r回车符
  • \unnnn,字符的Unicode编码。
  • \nnn,3位八进制数表示字符的编码。
  • \xnn,两位十六进制数表示字符编码。
  • \字符,转义指定的字符。

此外,在模式中还可以指定匹配内容出现的次数,如:

  • X?,X出现0次或1次。
  • X*,X出现0次或多次。
  • X+,X出现1次或多次。
  • X{n},X出现n次。
  • X{n,} ,X最少出现n次。
  • X{n,m},X出现n到m次。

需要匹配多个格式时,可以使用|符号分隔,并可以使用一对圆括号组合模式。要求匹配内容在文本的开始部分时,应在模式前使用^符号,要求匹配内容在文本的结尾时,在模式后使用$符号,下面的代码演示了^符号和$符号的应用。

Java
import java.util.regex.*;
public class Hello {
	public static void main(String[] args) {
		Pattern p1 = Pattern.compile("^abc");
		Pattern p2 = Pattern.compile("abc$");
		String s = "abcdefg";
		System.out.println(p1.matcher(s).find());
		System.out.println(p2.matcher(s).find());
	}
}

代码执行结果如下图。

需要识别独立的单词时,需要使用断字符(\b),下面的代码演示了识别关键字的基本方法。

C#
import java.util.regex.*;public class Hello {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("\\bpublic\\b|\\bextends\\b|\\bclass\\b");
		String s = "public class classTest() extends Object {}";
		Matcher m = p.matcher(s);
        while(m.find()) {
			System.out.println(m.group());
        }
	}
}

代码执行结果如下图。

Matcher类

Matcher类是处理正则表达式的主类,下面讨论几个常用的方法。

find()方法返回boolean类型的值,判断文本中是否有匹配模式的内容。下面的代码,用于判断一个字符串是否为6位数字(邮政编码)。

Java
import java.util.regex.*;
public class Hello {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("^[1-9][0-9]{5}?$");
		String s = "110245";
		Matcher m = p.matcher(s);
        System.out.println(m.find());
	}
}

执行代码会显示true,可以修改s的内容来观察执行结果。

多次执行find()方法时,会依次返回匹配的内容,下面的代码,用于提取文本内容中第一个字母为J或j的单词。

Java
import java.util.regex.*;
public class Hello {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("\\b[J|j]\\w*\\b");
		String s = "Tom Jerry John Johnson Maria Smith Jim joy";
		Matcher m = p.matcher(s);
        while(m.find()) {
	        System.out.println(m.group());
        }
	}
}

代码执行结果如下图。

replaceAll()方法可以使用指定的内容替换匹配内容。先看一个简单的示例,直接将第一个字母是J或j的单词替换为***,如下面的代码。

Java
import java.util.regex.*;
public class Hello {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("\\b[J|j]\\w*\\b");
		String s = "Tom Jerry John Johnson Maria Smith Jim joy";
		Matcher m = p.matcher(s);
		System.out.println(m.replaceAll("***"));
	}
}

代码执行结果如下图。

String类中使用正则表达式

实际上,在String类中的一些方法也可以使用正则表达式,如replaceAll​(String regex, String replacement)方法就可以通过正则表达式替换内容,并返回替换后的新字符串。如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		String s = "Tom Jerry John Johnson Maria Smith Jim joy";
		String result = s.replaceAll("\\b[J|j]\\w*\\b","***");
		System.out.println(result);
	}
}

代码执行结果如下图。

split​(String regex)方法用于分割字符串,下面的代码,我们通过空格分隔单词,单词之间可能由一个或多个空格。

Java
public class Hello {
	public static void main(String[] args) {
		String s = "Tom  Jerry John  Maria   Smith  Jim   joy";
		String[] arr = s.split("[ ]+");
        for(String word : arr) {
	System.out.println(word);
        }
	}
}

代码执行结果如下图。

从以上一些简单的示例中,我们可以看到正则表达式的功能是非常强大的,如果需要处理大量的文本,大家可以根据需要深入学习正则表达式的应用。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc001014