我做正則運算式已經 25 年多了,但我不明白為什么這個正則運算式不匹配(使用 Perl 語法):
"unify" =~ /[iny]{3}/
# as in
perl -e 'print "Match\n" if "unify" =~ /[iny]{3}/'
有人能幫忙解開這個謎嗎?
uj5u.com熱心網友回復:
模式中的量詞 意味著將一個字符與該模式(或或)匹配,然后是具有相同模式的另一個字符,然后是另一個。三——一個接一個。所以你的字串沒有那個,但最多可以召集兩個,.{3}[iny]{3}inyunifyni
這已經在其他答案中解釋過了。我想補充的是對評論中澄清的回答:如何檢查這些字符在字串中出現 3 次,隨意散布。除了匹配整個子字串,如已經顯示的那樣,我們還可以使用前瞻:
(?=[iny].*[iny].*[iny])
這不會“消耗”任何字符,而是“向前看”模式,而不是從當前位置推進引擎。因此,它可以作為子模式非常有用,與更大的正則運算式中的其他模式結合使用。
一個 Perl 示例,在命令列上復制粘貼:
perl -wE'say "Match" if "unify" =~ /(?=[iny].*[iny].*[iny])/'
這樣做的缺點,以及消耗整個這樣的子字串,是所有三個子模式的字面拼寫;當需要動態決定數量時怎么辦?還是十二點的時候?當然,該模式可以在運行時構建。在 Perl 中,一種方式
my $pattern = '(?=' . join('.*', ('[iny]')x3) . ')';
然后在正則運算式中使用它。
uj5u.com熱心網友回復:
字母n,i和y并不都是相鄰的。他們之間有一個f。
/[iny]{3}/匹配任何包含從 set 中提取的三個字母的子字串的字串{i, n, y}。字母可以是任何順序;它們甚至可以重復。
選擇三個字符三次,替換,意味著有 3 3 = 27 個匹配的子字串:
iii,iin,iiy,ini,inn,iny,iyi,iyn,iyynii,nin,niy,nni,nnn,nny,nyi,nyn,nyyyii,yin,yiy,yni,ynn,yny,yyi,yyn,yyy
要匹配不相鄰的字母,您可以使用以下之一:
-
[iny].*[iny].*[iny] -
[iny](.*[iny]){2} -
([iny].*){3}
(最后一個選項本身就可以正常作業,因為您的搜索是未錨定的,但可能不適合作為較大正則運算式的一部分。最終的.*匹配可能超出您的預期。)
uj5u.com熱心網友回復:
原子的{3}意思是“前一個元素的三個連續匹配”。雖然字符類中的所有字母都存在于字串中,但它們不是連續的,因為它們被字串中的其他字符分隔。
問題不是字符類中專案的順序。事實上,您無法匹配字符類中三個字母的任何組合,其中三個字母在示例字串中彼此直接相鄰。
uj5u.com熱心網友回復:
該模式查找三個連續出現的字母i,n或y。您沒有連續出現三個。
也許您打算使用[inf]or [ify]?
uj5u.com熱心網友回復:
看起來你正在尋找 3 個連續的字母,所以你的不應該匹配
[iny]{3} //no match
[unf]{3} //no match
[nif]{3} //matches nif
[nify]{3} //matches nif
[ify]{3} //matches ify
[uni]{3} //matches uni
希望有所幫助:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411026.html
標籤:
