正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
正则表达式已经在很多软件中得到广泛的应用,主要有C#正则表达式、Java正则表达式、JavaScript正则表达式、Python正则表达式以及Ruby正则表达式等类型。
“^A\d{3}$”可以成功匹配:“A001”、“A999”;不可匹配:“B001”、“A0001”
"[abc]1"可以成功匹配:“a1”、“b1”、“c1”,不可匹配:“ab1”、“x1”
“[a-f]1”可以成功匹配:“a1”、“b1”、“f1”,不可匹配:“g1”、“ab1”
“[a-f0-9]{6}”可以成功匹配:“1a2b3c”、“ffffff”、“ff3434”,不可匹配:“abc12”、“A0000F”
“[^0-9]{6}”可以成功匹配:“abcdef”、“$$$$$$”、“A-B-C”,不可匹配:“1abcde”、“A0000F”
如何编写正则表达式:
"2020-03-06"——>“2020” “03” “06”
"010-1234567"——>"010" "1234567"
"021-12345678"——>"021" "12345678"
"0755-123456"——>"0755" "123456"
^([0-1][0-9])|2[0-3])\:([0-5][0-9])$
Pattern pattern = Pattern.compile("^(\\d{3,4})\\-(\\d{6,8})$");
Matcher matcher = pattern.matcher("010-12345678");
if (matcher.matches()) {
String whole = matcher.group(0); //0表示匹配的整个字符串
String areaCode = matcher.group(1); //1表示匹配的第1个子串
String telNumber = matcher.group(2);//2表示匹配的第2个子串
}
正则表达式分组可以通过Matcher对象快速提取子串:
group(0)表示匹配的整个字符串
group(1)表示第1个子串
group(2)表示第2个子串
正则表达式 | 规则 | 可以匹配 |
A | 指定字符 | A |
\u548c | 指定Unicode字符 | 和 |
. | 任意字符 | a,1,2,……,9 |
\d | 0~9 | 0,1,2,3,4,5,6,7,8,9 |
\w | a-z,A-Z,0~9,_ |
a,A,0,_,…… |
\s | 空格、Tab键 | "" |
\D | 非数字 | a,A,&,_,…… |
\W | 非\w | &,@,中,…… |
\S | 非\s | a,A,&,_,…… |
AB* | 任意个数字符 | A,AB,ABB,ABBBB…… |
AB+ | 至少1个字符 | AB,ABB,ABBB |
AB? | 0个或1个字符 | A,AB |
AB{3} | 指定个数字符 | ABBB |
AB{1,3} | 指定范围个数字符 | AB,ABB,ABBB |
AB{2,} | 至少n个字符 | ABB,ABBB,…… |
AB{0,3} | 最多n个字符 | A,AB,ABB,ABBB |
^ | 开头 | 字符串开头 |
$ | 结尾 | 字符串结束 |
[ABC] | […]内任意字符 | A,B,C |
[A-F0-9xy] | 指定范围的字符 | A,……F,0,……9,x,y |
[^A-F] | 指定范围外的任意字符 | 非A,……,F |
AB|CD | AB或CD | AB,CD |
AB|CD|EFG | AB或CD或EFG | AB,CD,EFG |
- 正则表达式匹配默认使用贪婪匹配
- 使用?表示对某一规则进行非贪婪匹配
- 注意区分?的含义
给定一个字符串表示的数字,判断该数字末尾0的个数,例如:
“123000”:3个0
“10100”:2个0
“1001”:0个0
尽可能多地向后匹配
static Pattern pattern = Pattern.compile("^(\\d+)(0*)$");
Matcher matcher = pattern.matcher("123000");
if (matcher.matches()) {
matcher.group(1); // "123000"
matcher.group(2); // ""
}
使用?实现非贪婪匹配
static Pattern pattern = Pattern.compile("^(\\d+?)(0*)$");
Matcher matcher = pattern.matcher("123000");
if (matcher.matches()) {
matcher.group(1); // "123"
matcher.group(2); // "000"
}
static Pattern pattern = Pattern.compile("^(\\d??)(9*)$");
Matcher matcher = pattern.matcher("9999");
if (matcher.matches()) {
matcher.group(1); // ""
matcher.group(2); // "9999"
}
其中,\\d??中,第一个?表示“匹配0个或1个”;第二个?表示“非贪婪匹配”
public class RegexDemo {
static Pattern pattern = Pattern.compile("^\\d+?(0*)$");
public static int zeros(String s){
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
String zeroStr = matcher.group(1);
return zeroStr.length();
}
throw new IllegalArgumentException("Not a number");
}
}
class RegexDemoTest {
@Test
public void testZeros() {
assertEquals(0, RegexDemo.zeros("123456"));
assertEquals(1, RegexDemo.zeros("123450"));
assertEquals(2, RegexDemo.zeros("123400"));
assertEquals(3, RegexDemo.zeros("123000"));
assertEquals(4, RegexDemo.zeros("120000"));
assertEquals(2, RegexDemo.zeros("100200"));
}
}
正则表达式是一个字符串
正则表达式用字符串描述一个匹配规则
使用正则表达式可以快速判断给定的字符串是否符合匹配规则
Java内建正则表达式引擎java.util.regex