正则表达式

正则表达式常用字符

符号

含义

示例

.

任意一个字符

\

转意字符

\d

任意一个数字

\w

任意一个单词字符(数字、字母、下划线)

\s

任意一个空白字符(空格、制表符、换行)

\D

任意一个非数字字符

\W

任意一个非单词字符

\S

任意一个非空白字符

+

前面的字符必须至少出现一次(1次或多次)

runoo+b,可以匹配 runoob、runooob、runoooooob 等

*

前面的字符可以不出现,也可以出现一次或者多次

runoo*b,可以匹配 runob、runoob、runoooooob 等


前面的字符最多只可以出现一次(0次、或1次)

colou?r 可以匹配 color 或者 colour

{n}

表示前面的字符必须出现n次

{m,n}

表示前面的字符必须出现m-n次

{n,}

表示前面的字符必须出现至少n次

{,n}

表示它前面的东西最多出现n次

^

表示要以^后的字符开始

$

表示要以$前的字符结束

[ab1]

代表a或b或者1

[a-c]

代表a,b,c中的任意一个字符

[a-c1-3]

代表a,b,c,1,2,3中任意一个字符

[^a-c]

代表不含a,b,c的其他任意一个字符

[a-g&&[^b-d]]

代表a,e,f,g中的任意一个字符。

com|org|cn

代表包含其中之一

其中( )是用来分组的,也就是把匹配到的内容分成几个部分。在使用Matcher类来获取匹配到的分组数据时,匹配到的整个字符串默认为第0组,所以自己定义的组别要从第1组算起。

正则表达式在java中的使用

java.util.regex

java.util.regex 包主要包括以下三个类:

  • Pattern 类:
    pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个 Pattern对象,你必须首先调用其公共静态编译方法,它返回一个Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
  • Matcher 类:
    Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher也没有公共构造方法。你需要调用 Pattern对象的 matcher 方法来获得一个 Matcher对象。
  • PatternSyntaxException
    PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
/* import java.util.regex.*; */
public void RegexExample() {
	String input = "I am Jimmy from mp.csdn.net";
	String regex = ".*csdn.*";
		
	// 方式1:String 的 matches 方法
	boolean flag1 = input.matches(regex);
		
	// 方式2:Pattern 对象的 matches 方法
	boolean flag2 = Pattern.matches(regex, input);
		
	// 方式3: Matcher 对象的 matches 方法
	Pattern p = Pattern.compile(regex);
	Matcher m = p.matcher(input);
	boolean flag3 = m.matches();
	
	System.out.println("字符串中是否包含了'csdn'子字符串? " + flag1 );
	System.out.println("字符串中是否包含了'csdn'子字符串? " + flag2 );
	System.out.println("字符串中是否包含了'csdn'子字符串? " + flag3 );
}
输出结果:
	字符串中是否包含了'csdn'子字符串? true
	字符串中是否包含了'csdn'子字符串? true
	字符串中是否包含了'csdn'子字符串? true

matcheslookingAt方法

matches()lookingAt()方法都用来尝试匹配一个输入序列模式。不同的是 matches()要求整个序列都匹配,而 lookingAt()不要求;
lookingAt()方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配;

public void matchAndLookingExample() {
	String REGEX = "foo";
	String INPUT = "foooooooooo";
	String INPUT2 = "ooooofoooooo";
	
	Pattern pattern = Pattern.compile(REGEX);
	Matcher matcher = pattern.matcher(INPUT);
	Matcher matcher2 = pattern.matcher(INPUT2);
	
	System.out.println("lookingAt(): "+matcher.lookingAt());
	System.out.println("matches(): "+matcher.matches());
	System.out.println("lookingAt(): "+matcher2.lookingAt());
}
输出结果:
	lookingAt(): true	// 开头匹配
	matches(): false	// 不是整个序列都匹配
	lookingAt(): false	// 开头不匹配

参考:
(1)菜鸟教程 https://www.runoob.com/java/java-regular-expressions.html
(2)Java 正则表达式:语法讲解和常用表达式汇总——Jimmy大叔