扩展正则表达式说明

扩展正则表达式说明

这是《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:]*\.'

是否*仅适用于较低的字符类别?

答案1

Theophrastus 和 Steeldriver 的评论摘要(请随意编辑此答案)以及一些评论:

在第一个例子中,第二个例子呢?适用于 () ? 中包含的整个表达式?这意味着它将匹配 555 或 (555)。

第二个?适用于关闭(转义)),第一个?适用于打开(转义)(。在这两种情况下,它都匹配文字字符。此外,您的正则表达式中的 后面有两个空格字符,而不是一个空格字符?,因此您必须删除一个空格才能匹配您的示例输入。

您的正则表达式将匹配(删除一个空格字符):

(555) 123-4567
(555 123-4567
555) 123-4567
555 123-4567

要匹配一个组,您不会在扩展正则表达式中转义括号。

匹配示例555以及可选组中的以下空格:

$ echo -e "555 123-4567\n123-4567" | grep -E '^([0-9]{3} )?[0-9]{3}-[0-9]{4}$'
555 123-4567
123-4567

* 星号适用于整个表达式还是仅适用于包含上下字符类的表达式的第二部分?

是的,它仅适用于括号表达式[[:upper:][:lower:] ]

grep -E '[[:upper:][:upper:]][:lower:]*\.'

* 是否仅适用于较低的字符类?

是的,如果没有拼写错误的话。对于较低的字符类,您需要两个括号,这[[:upper:][:upper:]]没有多大意义。一个[[:upper:]]就足够了。

所以它会是

grep -E '[[:upper:]][[:lower:]]*\.'

相关内容