Regular-Expression

擴展正則表達式說明

  • July 27, 2019

這是 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 或 (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:]]*\.'

引用自:https://unix.stackexchange.com/questions/532483