? - 匹配元素零次或一次
这个量词实际上意味着“使前面的元素成为可选的”。 假设我们想检查一个电话号码的有效性,并且我们认为一个电话号码如果匹配这两种形式中的任何一种,则它是有效的:
(NNN) NNN-恩恩恩恩恩恩-分
其中“n”是一个数字。 我们可以构造一个这样的正则表达式:
^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
在这个表达式中,我们在括号字符后面加上问号来表示它们将被匹配零次或一次。 同样,由于括号通常是
元字符(在 ERE 中),我们在它们前面加上反斜杠,使它们被视为文字。
让我们试试看:
[我@linuxbox ~]$ 回声“(555)123-4567”| grep -E '^\(?[0-9][0-9][0-9]
\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
[我@linuxbox ~]$ 回声“555 123-4567” | grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
+555-123-4567
[我@linuxbox ~]$ 回声“AAA 123-4567”| grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
[我@linuxbox ~]$
[我@linuxbox ~]$ 回声“(555)123-4567”| grep -E '^\(?[0-9][0-9][0-9]
\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
[我@linuxbox ~]$ 回声“555 123-4567” | grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
+555-123-4567
[我@linuxbox ~]$ 回声“AAA 123-4567”| grep -E '^\(?[0-9][0-9][0-9]\)
? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
[我@linuxbox ~]$
在这里我们看到表达式匹配电话号码的两种形式,但不匹配包含非数字字符的形式。