什么是正则表达式

正则表达式是一种用于匹配一组字符串中字符组合的模式。 它使用单个字符来描述,匹配一系列符合某个句法规则的字符串。它可以用来验证输入格式,搜索替换文本等

正则表达式字符

字符

作用

\

转义字符,提示后面的字符就是字面意义。 如\( 就是(

^

匹配字符串开始的位置。简单来说就是看字符串是否以符合正则表达式的规则开头

^

匹配字符串结尾。简单来说就是看字符串是否以符合正则表达式的规则结尾

.

匹配除换行\n之外的任意一个字符

*

匹配*号前的子表达式/字符0次或者多次

[list]

list = [char - char], 匹配list中的字符。 char - char是指list的范围,如0-9就是0到9,a-z就是小写a到z

[^list]

匹配不在list列表中的一个字符,如:[^0-9]匹配任意一位非数字字符

{n}

n=数字,匹配{n}前面的表达式n次。 如:[0-9]{2}可以匹配10到99的任意数字

{n,}

匹配{n,}之前的表达式至少n次

{n,m}

匹配{n,m}之前的表达式至少n到m次

|

或。 匹配|之前或者之后的表达式

其他字符

除此之外还有 \d表示所有数字,\w表示所有字符等。但是实测bash不支持这些表达式,只能用[list]这种形式。所以本文不再提及。这也是bash和其他编程语言的区别。在这里踩过坑。

示例

给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。

你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)

你也可以假设每行前后没有多余的空格字符。

假设 file.txt 内容如下:

987-123-4567

123 456 7890

(123) 456-7890

你的脚本应当输出下列有效的电话号码:

987-123-4567

(123) 456-7890

分析

这里的号码是由数字,-,空格,还有()组成的。首先要注意的坑是"()"在正则里由特殊含义,所以要进行转义。另外这边有两个匹配条件,只要一个成立就是所有都成立,所以需要用或 “|”.

第一个条件:

[0-9]{3}-[0-9]{3}-[0-9]{4}

第二个条件:

\([0-9]{3}\) [0-9]{3}-[0-9]{4}

用"|"组合

[0-9]{3}-[0-9]{3}-[0-9]{4}|\([0-9]{3}\) [0-9]{3}-[0-9]{4}

注意:|前后不能有空格,否则会被当成子表达式的一部分进行匹配。这边踩过坑

验证:

mycontent.txt
987-123-4567
123 456 7890
(123) 456-7890
This is a line
cat mycontent.t[0-9]{3}-[0-9]{3}-[0-9]{4}|\([0-9]{3}\) [0-9]{3}-[0-9]{4}"]{3}-[0-9]{4}"

输出

实用工具

最后给个在线的正则匹配验证的网址,可以边写边验证。

https://regex101.com/