正则表达式(JAVA)详解
正则表达式
正则表达式常用字符
符号 | 含义 | 示例 |
---|---|---|
. | 任意一个字符 | |
\ | 转意字符 | |
\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
matches
和 lookingAt
方法
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大叔 https://blog.csdn.net/weixin_44259720/article/details/88179885