正则表达式基本

依据正则表达法这套标准,来用几个符号组成的正则表达式表示一定规则的字符串。通过正则表达式,方便地让计算机理解我们想要表达的一长串字符串。
对于一些查找、删除、替换等等支持正则表达式的工具,可以用正则表达式来理解我们想要告诉计算机的字符串,并根据工具或者接口本身的功能和作用来对我们选定的字符串进行处理。

正则表达式的特殊符号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 收录,方便查表
[:alnum:]代表英文大小写字母及数字
[:alpha:]代表英文大小写字母
[:blank:]代表空格和 tab 键
[:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL
[:digit:]代表数字
[:graph:]代表空白字符以外的其他
[:lower:]小写字母
[:print:]可以被打印出来的任何字符
[:punct:]代表标点符号
[:upper:]代表大写字符
[:space:]任何会产生空白的字符如空格,tab,CR 等
[:xdigit:]代表 16 进位的数字类型

grep -n '[[:lower:]]' Test.txt # 查找小写字母

grep与正则表达式

grep命令

参数说明:

-a :将 binary 档案以 text 档案的方式搜寻数据(一般可执行的比如shell脚本就是binary档案)

-c :计算找到 ‘搜寻字符串’ 的次数

-i :忽略大小写的不同,所以大小写视为相同

-n :顺便输出行号

-v :反向选择,即显示出没有 ‘搜寻字符串’ 内容的那一行

示例:

1
2
3
grep -n 'the' test.txt # 查找有“the”的字符串
grep -in 'the' test.txt # 查找有“the()忽略大小写”的字符串
grep -vn 'the' test.txt # 反向查找,查找所有没有“the”的字符串

字符组匹配:

1
2
grep -n 't[ea]st' test.txt # 查找包含test或者tast的字符串
grep -n '[^#]' test.txt # 查找不包含“#”的字符串

[]表示包含这里面的所有字符中的一个,有且只有一个。
[n1-n2]表示搜索指定的字符串范围,例如[0-9]、[a-z] 、[A-Z]等

[^…]表示这里面所有的字符都不要

行首符:^ 与 行尾符:$

1
2
3
4
grep -n 'Mr.Zhou' zhzh.txt # 查找“Mr.Zhou”为开头的字符串
grep -n '^[a-z]' zhzh.txt #查找开头不是小写字母的字符串
grep -n 'Zhou$' zhzh.txt # 查找结尾不是Zhou的字符串
grep -v '^$' zhzh.cpp | grep -v '^#' # 反向查找,过滤掉空白行和注释行

任意一个字符 “.” 与 重复相同字符 “*”

1
2
3
4
5
6
7
# *(星号):代表重复前面 0 个或者多个字符。
# e*: 表示具有空字符或者一个以上 e 字符。
# ee*,表示前面的第一个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。
# eee*,表示前面两个 e 字符必须存在。第三个 e 则可以是 0 个或者多个 e 字符。
# ee*e :表示前面的第一个与第三个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。

grep -n 'zhzh.xyz*' zhzh.txt # 显示“zhzh” + “任意一个字符,有且只有一个” + “0~n个z”

限定连续字符范围

{ }可限制一个范围区间内的重复字符数。举个例子,若要找出 2~5 个 o 的连续字符串,此时便要用到{}了。由于 { 与 } 在 shell 中有特殊意义,需要用到转义字符\。

1
2
grep -n 'z\{5\}h' zhzh.txt # 查找字符串“z” + “5个z” + “h”
grep -n 'z\{2,5\}h' zhzh.txt # 查找字符串“z” + “2到5个z” + “h”

Java与正则表达式

正则表达式中常用的元字符

元字符正则表达式中的写法意 义
..代表任意一个字符
\d\\d0~9任意一个数字
\D\\D任意一个不是数字的字符
\s\\s空白符号“\t”、“\n”(把字符串根据空格分割为字符串数组)
\S\\S任意一个非空白符号
\w\\w代表可以用作标识符的字符,除了“$”(看示例程序)
\W\\W代表不可以用作标识符的字符
\p{Lower}\\p{Lower}小写字母a~z
\p{Upper}\\p{Upper}大写字母A~Z
\p{ASCLL}\\p{ASCLL}ASCLL字符
\p{Alpha}\\p{Alpha}字母字符
\p{Digit}\\p{Digit}十进制数字
\p{Alnum}\\p{Alnum}数字或者字母
\p{Punct}\\p{Punct}标点符号
未完待续………………

“[ ]” 的使用

[a-zA-z] 任意一个大写或者小写字母
[a-e[g-z]] a~e或者g~z中的任意一个字母
[a-o&&[def]] a~o和[def]的交集,也就是d、e、f
[a-d&&[^bc]] a~d和[^bc]的交集,a~d减去[bc]的差运算,即a、d

限定修饰符

|限定修饰符|意 义|示 例|
|—|—|—|—|
|?|0次或者多次|A?|
||0次或者多次|A| |+|一次或者多次|A+|
|{n}|正好出现n次|A{2}|
|{n,}|至少出现n次|A{3,}|
|{n,m}|出现n~m次|A{2,6}|

示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package xyz.zhzh;

import java.util.Scanner;

public class Main {
public static void main(String[] arg) {
String regex = "\\w+@\\w+(\\.\\w{2,5})*\\.\\w{2,3}";
Scanner in = new Scanner(System.in);
String email = in.nextLine();
while (!email.equals("q")) {
if (email.matches(regex)) {
System.out.println(email + " 是一个合法E-mail地址格式");
}
else {
System.out.println(email + " 不是一个合法的E-mail地址格式");
}
email = in.nextLine();
}
}
}