
我能舉個例子來說明這三個元素(這些元素稱為元字元嗎?)有何不同?
我知道這*
意味著要么全有要么全無,但我不確定這是否是正確的思考方式。另一方面.
又?
看起來一樣。它們匹配一個字符,對嗎?
答案1
你可能會感到困惑常用表達和殼球
在正規表示式語法中.
表示任何單一字元(通常不包括換行符),*
而是量詞表示零個或多個前面的正規表示式原子(字元或群組)。?
是一個量詞,表示零或一前面原子的實例,或(在支援它的正規表示式變體中)修飾語將量詞行為設定為非貪婪。
在 shell glob 中,?
表示單一字元(如 regex 的.
),而*
表示零個或多個字元的序列(相當於 regex .*
)。
您可能會發現一些有用的參考資料:http://www.regular-expressions.info/quickstart.html和http://mywiki.wooledge.org/glob
答案2
直接取自維基百科:
? 問號表示前一個元素出現零次或一次。例如,colour?r 符合“color”和“color”。
*星號表示前面的元素出現零次或多次。例如,ab*c 符合「ac」、「abc」、「abbc」、「abbbc」等。
最大的差別是星號匹配零個或多個出現次數,而問號匹配零或一發生。比較這兩個例子:
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'
colour
color
colouur
因為colouur
字母 u (限定符 之前的前一個元素?
)出現多次,所以它不與 匹配?
,但與 匹配*
類似的例子:
$ printf "error\neror\ner\n" | egrep 'er?or'
eror
$ printf "error\neror\ner\n" | egrep 'er*or'
error
eror
來自同一維基百科頁面:
匹配任何單一字元(許多應用程式不包括換行符,並且哪些字元被視為換行符是特定於風味、字元編碼和平台的,但可以安全地假設包含換行符)。在 POSIX 方括號表達式中,點字元與文字點相符。例如,ac 符合「abc」等,但 [ac] 只符合「a」、「.」或「c」。
在我們的例子中,
$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'
colouur
夠恰當的是,最後一個讀作match any line that has "colou", plus any character, plus letter "r"
結論
您問過:“我知道‘*’意味著全部或全部,但我不確定這是否是正確的思考方式。另一個‘.’” &'?看起來一樣。正如您所看到的,點和星號並不完全相同。點作用於可能佔據該特定位置的任何字符,而問號作用於前面的元素。
答案3
注意:Examples provided are in Python.
儘管概念保持不變。
'.'
是一個匹配符號匹配任何字符,除了換行符(這也可以用re.DOTALL
Python 中的參數來覆蓋)。因此它也被稱為通配符。
'*'
是一個量詞(定義元素出現的頻率)。是縮寫{0,}。
它的意思是“匹配零個或多個”——星號前面的群組可以在文字中出現任意多次。它可以完全不存在或一遍又一遍地重複。
'?'
也是一個量詞。是縮寫{0,1}。
它的意思是“符合此問號之前的群組中的零個或一個。”也可以解釋為問號之前的部分是可選的。
例如:
pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'
mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'
在上面的例子中'?'表示前面的兩位數字是可選的。 它們可能不會出現或最多出現一次。
「.」之間的區別和 '?
'.'
匹配/接受/驗證任何單一字符它在正規表示式中所處的位置。
例如:
pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']
'?'
匹配/驗證零次或一次出現其前面的組。
檢查手機號碼範例。
同樣適用於'*'
.它將檢查其前面的組出現零次或多次。
組合:
'.*'
:接受盡可能多的可用序列。貪心法。
'.*?
' 接受第一個匹配的序列並停止。非貪婪方法
有關更多信息,請考慮閱讀以下兩個問題...