正则表达式
正则表达式是对字符串进行操作的一种逻辑公式,它是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。其目的是通过将目的字符串与其匹配来进行检验和获取我们想要的特定部分。
常见的特定字符表如下
正则表达式中的写法 | 意义 |
---|---|
. | 代表任意一个字符 |
\\b | 匹配一个字边界,如 “ss\b” 匹配 “success”不匹配“message” |
\\B | 匹配非字边界,如 “ss\B” 匹配 “message”不匹配“success” |
\\d | 代表0-9的任何一个数字 |
\\D | 代表任何一个非数字字符 |
\\f | 换页符匹配 |
\\n | 换行符匹配 |
\\r | 匹配一个回车符 |
\\s | 代表空白字符,如’\t’、’\n’ |
\\S | 代表非空白字符 |
\\t | 制表符匹配 |
\\v | 垂直制表符匹配 |
\\w | 代表可用作标识符的字符,但不包括“$” |
\\W | 代表不可用于标识符的字符 |
构成正则表达式的语言其实由两种基本字符类型组成:原义文本字符和元字符。而所谓的元字符即是指上面所说具有特殊意义的专用字符。在正则表达式中可以使用方括号括起若干个字符来表示一个字符,该元字符可代表方括号中的任何一个字符。举例如下:
[^123] 代表1、2、3之外的任何字符。
[a-r] 代表a-r之间的任何一个字母。
[a-zA-Z] 可代表任何一个英文字母。
[a-e[g-z]] 代表a-e或g-z之间的任何一个字母(并运算)。
[a-h&&[def]] 代表字母d、e、f(交运算)。
[a-d&&[^bc]] 代表字母a、d(差运算)。
另外,在正则表达式中允许使用限定修饰符来限定元字符出现的次数。限定修饰符的用法如下所示。
限定修饰符 | 示例 | 意义 |
---|---|---|
\ | \\n | 转义字符,“\\n” 相当于 换行符 “\n” |
^ | ^A | 匹配输入字符A的行首,即第一个字符 |
$ | A$ | 匹配输入字符A的行尾,即倒数的字符 |
? | A? | A出现0次或1次 |
* | A* | A出现0次或多次 |
+ | A+ | A出现1次或多次 |
{n} | A{2} | A正好出现2次 |
{n,} | A{3,} | A至少出现3次 |
{n,m} | A{3,4} | A出现3次或4次 |
那么,正则表达式可以做哪些事情?常见的功能如下:
- 字符串的匹配(查找)功能
- 字符串的替换功能
- 字符串的切割功能
- 字符串的验证功能
根据给定的正则规则匹配(查找)字符串
public static void main(String[] args){
// 在杂乱无章的数据堆里面查找第二位数字为 '3' '5' '8' 的手机号
String regex = "1[358]\\d{9}";
String[] phoneNum = {"13157809910","17157809920","18157809930"};
for(String str : phoneNum){
if(str.matches(regex)){
System.out.println(str);
}
}
}
结果输出结果如下
13157809910
18157809930
根据给定的正则规则替换字符串
public static void main(String[] args){
// 将 ~ 替换成空格
String regex = "\\~";
String str = "Happy~ Everyday~";
System.out.println(str.replaceAll(regex, " "));
}
结果输出结果如下
Happy Everyday
根据给定的正则规则切割字符串
public static void main(String[] args){
// 按 .后接一个字符的规则 将字符串拆分
String regex = "\\.\\w{1}";
String str = "1.a2.b3.c4.d5.e6.f7.g8.h9.i0.j1";
String[] split = str.split(regex);
System.out.println(Arrays.toString(split));
}
结果输出结果如下
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
根据给定的正则规则验证字符串
public static void main(String[] args){
// 验证字符串满足长度为 2
Pattern p = Pattern.compile("\\b[a-zA-Z]{2}\\b");
// 需要验证的字符串
Matcher m = p.matcher("Today is Tuesday.");
// 获取匹配的数据
while (m.find()) {
// 打印验证通过的字符串
System.out.println(m.group());
}
}
结果输出结果如下
is
另外附上练习其他元字符的使用示例。
public static void main(String[] args) {
String str1 = "123def456";
String str2 = "abc def456";
String str3 = "abc@123.def.com";
String str4 = "success";
String str5 = "message";
String pattern1 = "^[0-9]+\\w+456$";
String pattern2 = "\\w+\\s\\w{3}[^123]*";
String pattern3 = "\\w+@\\d+(\\.\\w{2,3})\\.\\w{2,3}";
String pattern4 = "\\w+ss\\b";
String pattern5 = "\\w+ss\\B\\w+";
System.out.println(str1.matches(pattern1)); // true
System.out.println(str2.matches(pattern2)); // true
System.out.println(str3.matches(pattern3)); // true
System.out.println(str4.matches(pattern4)); // true
System.out.println(str5.matches(pattern5)); // true
}