这是 Linux Command Line 一书中的一个示例
如果我尝试匹配 (555) 123-4567 或 555 123-4567 - 可以使用以下扩展正则表达式。
^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
简化为
^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$
在第一个示例中,第二个示例是否?
适用于包含在 ? 中的整个表达式()
?这意味着它将匹配555
或(555)
。
在第二个例子中:
echo "This works." | grep -E '[[:upper:]][[:upper:][:lower:] ]*\.'
*
星号适用于整个表达式还是仅适用于包含大写和小写字符类的表达式的第二部分?
如果前面的表达式是这样的:
grep -E '[[:upper:][:upper:]][:lower:]*\.'
*
仅适用于较低的字符类吗?
Theophrastus 和 steeldriver 的评论摘要(请随时编辑此答案)并附上一些评论:
第二个
?
适用于关闭(转义))
,第一个?
适用于打开(转义)(
。在这两种情况下,它都匹配文字字符。此外,您的正则表达式中有两个空格字符而不是一个?
,因此您必须删除一个空格以匹配您的示例输入。您的正则表达式将匹配(删除一个空格字符):
要匹配一个组,您不会在扩展正则表达式中转义括号。
匹配示例
555
和可选组中的以下空格:是的,它只适用于括号表达式
[[:upper:][:lower:] ]
。是的,如果没有拼错的话。对于较低的字符类,您需要两个括号,并且
[[:upper:][:upper:]]
没有多大意义。一个[[:upper:]]
就足够了。所以它会是