本文介绍 Java 正则表达式语法及常用的正则表达式实例。
目录
- 正则表达式简介
- Java 正则表达式语法
- 验证字符串是否合法
- 在字符串中替换特定字符或子串
- 常见正则表达式实例
- 正则表达式语法总结
正则表达式简介
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些字符的组合组成一个【规则字符串】,这个【规则字符串】用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和一个字符串可以实现以下功能:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
- 根据正则表达式逻辑从字符串中获取想要的特定部分。
Java 正则表达式语法
java.util.regex
包中有实现正则表达式所需的类:
-
Pattern
正则表达式编译后的表达形式,没有公共构造方法,需要调用静态compile
方法生成Pattern
对象。 -
Matcher
根据Pattern
对象对字符串进行解释和匹配操作的引擎,没有公共构造方法,需要调用Pattern
对象的matcher
方法生成Matcher
对象。 MatchResult
-
PatternSyntaxException
当正则表达式中存在语法错误时抛出,继承自IllegalArgumentException
,属于运行时异常。
验证字符串是否合法
步骤:
- 定义正则表达式字符串;
- 编译生成
Pattern
对象; - 调用
Pattern
对象的matcher
方法生成Matcher
对象; - 调用
Matcher
对象的matches
方法执行校验。
import org.junit.Assert;
import org.junit.Test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
@Test
public void test() {
// 只能输入数字
String regex = "^[0-9]*$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("0123456789");
Assert.assertTrue(matcher.matches());
matcher = pattern.matcher("A123456789");
Assert.assertFalse(matcher.matches());
}
}
在字符串中替换特定字符或子串
步骤:
- 定义正则表达式字符串;
- 编译生成
Pattern
对象; - 调用
Pattern
对象的matcher
方法生成Matcher
对象; - 调用
Matcher
对象的replaceAll
方法执行替换。
import org.junit.Test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
@Test
public void test() {
// 将字符串中圆括号替换成双引号
String regex = "[()]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("The scope is (1, 10)");
System.out.println(matcher.replaceAll("\""));
}
}
常见正则表达式实例
数字
^[0-9]+$
整数
^0|[1-9][0-9]*$
两位小数
^(0|[1-9][0-9]*)(.[0-9]{2})$
长度为 4 的任意字符
^.{4}$
英文字母(大小写)、数字和下划线
^\w+$
邮箱
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
URL
^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
中文
[\u4e00-\u9fa5]
文件名
^[\w-\u4e00-\u9fa5]+|([\w.-\u4e00-\u9fa5]+\.[\w-\u4e00-\u9fa5]+)$
正则表达式语法总结
\
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
如:n
匹配字符n
,\n
匹配换行符;\\\\
匹配\\
,\\(
匹配(
。^
匹配输入字符串开始的位置,如果设置了RegExp
对象的Multiline
属性,^
还会与\n
或\r
之后的位置匹配。$
匹配输入字符串结尾的位置,如果设置了RegExp
对象的Multiline
属性,$
还会与\n
或\r
之前的位置匹配。*
零次或多次匹配前面的字符或子表达式。
如:zo*
匹配z
和zoo
。
*
等效于{0,}
。+
一次或多次匹配前面的字符或子表达式。
如:zo+
匹配zo
和zoo
,但与z
不匹配。
+
等效于{1,}
。?
零次或一次匹配前面的字符或子表达式。
如:do(es)?
匹配do
和does
。
?
等效于{0,1}
。{n}
n
是非负整数,正好匹配 n 次。
如:o{2}
与Bob
中的o
不匹配,但与food
中的两个o
匹配。{n,}
n
是非负整数,至少匹配 n 次。
如:o{2,}
与Bob
中的o
不匹配,但匹配foooood
中所有的o
。
o{1,}
等效于o+
,o{0,}
等效于o*
。{n,m}
m
和n
是非负整数,其中n <= m
,匹配至少n
次,至多m
次。
如:o{1,3}
匹配fooooood
中的头三个o
。
o{0,1}
等效于o?
。
注意:不能将空格插入逗号和数字之间。.
匹配除\r\n
之外的任何单个字符,若要匹配包括\r\n
在内的任意字符,请使用诸如[\s\S]
之类的模式。x|y
匹配x
或y
。
如:z|food
匹配z
或food
,(z|f)ood
匹配zood
或food
。[xyz]
匹配包含的任一字符。
如:[abc]
匹配plain
中的a
。[^xyz]
匹配未包含的任何字符。
如:[^abc]
匹配plain
中p
,l
,i
,n
。[a-z]
匹配指定范围内的任何字符。
如:[a-z]
匹配a
到z
范围内的任何小写字母。[^a-z]
匹配不在指定的范围内的任何字符。
如:[^a-z]
匹配任何不在a
到z
范围内的任何字符。\b
匹配一个字边界,即字与空格间的位置。
如:er\b
匹配never
中的er
,但不匹配verb
中的er
。\B
与\b
正好相反,非字边界匹配。
如:er\B
匹配verb
中的er
,但不匹配never
中的er
。\cx
匹配x
指示的控制字符。
如:\cM
匹配Control-M
或回车符。
x
的值必须在A-Z
或a-z
之间。如果不是这样,则假定c
就是c
字符本身。\d
数字字符匹配,等效于[0-9]
。\D
非数字字符匹配,等效于[^0-9]
。\f
换页符匹配,等效于\x0c
和\cL
。\n
换行符匹配,等效于\x0a
和\cJ
。\r
匹配一个回车符,等效于\x0d
和\cM
。\s
匹配任何空白字符,包括空格、制表符、换页符等,与[ \f\n\r\t\v]
等效。\S
匹配任何非空白字符,与[^ \f\n\r\t\v]
等效。\t
制表符匹配,与\x09
和\cI
等效。\v
垂直制表符匹配,与\x0b
和\cK
等效。\w
匹配任何单词字符,包括下划线,与[A-Za-z0-9_]
等效。\W
匹配任何非单词字符,与[^A-Za-z0-9_]
等效。