[英]Regex exactly n OR m times
考慮以下正則表達式,其中X
是任何正則表達式。
X{n}|X{m}
此正則表達式將測試X
恰好出現n
次或m
次。
是否有一個正則表達式量詞可以測試X
恰好n
次或m
次出現?
沒有單一的量詞表示“恰好 m 次或 n 次”。 你這樣做的方式很好。
另一種選擇是:
X{m}(X{k})?
其中m < n
和k
是nm
的值。
這是量詞的完整列表(參考http://www.regular-expressions.info/reference.html ):
?
, ??
- 0 或 1 次出現( ??
是懶惰的, ?
是貪婪的)*
, *?
- 任意數量的出現+
, +?
- 至少出現一次{n}
- 恰好n
{n,m}
- n
到m
,包括{n,m}?
- n
到m
,懶惰{n,}
, {n,}?
- 至少出現n
要獲得“恰好 N 或 M”,您需要將量化的正則表達式編寫兩次,除非 m,n 是特殊的:
X{n,m}
如果m = n+1
(?:X{n}){1,2}
如果m = 2n
不,沒有這樣的量詞。 但我會將其重組為/X{m}(X{mn})?/
以防止回溯問題。
很老的帖子,但我想貢獻一些可能有幫助的東西。 我已經完全按照問題中所述的方式進行了嘗試,它確實有效,但有一個問題:數量的順序很重要。 考慮一下:
#[a-f0-9]{6}|#[a-f0-9]{3}
這將找到所有出現的十六進制顏色代碼(它們的長度為 3 位或 6 位)。 但是當我像這樣翻轉它時
#[a-f0-9]{3}|#[a-f0-9]{6}
它只會找到 3 位數字或 6 位數字的前 3 位數字。 這確實有道理,正則表達式專家可能會立即發現這一點,但對許多人來說,這可能是一種特殊的行為。 無論順序如何,有一些高級 Regex 功能都可以避免此陷阱,但並非每個人都深入了解 Regex 模式。
TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
看起來您想要“xn 次”或“xm 次”,我認為正則表達式的直譯應該是(x{n}|x{m}).
像這樣https://regex101.com/r/vH7yL5/1
或者,在您可以擁有多於 m 個“x”的序列(假設 m > n)的情況下,您可以添加 'following no "x"' 和 'following by no "x",轉換為[^x](x{n}|x{m})[^x]
但這會假設在你“x”的后面和后面總是有一個字符。 正如你在這里看到的: https : //regex101.com/r/bB2vH2/1
您可以將其更改為(?:[^x]|^)(x{n}|x{m})(?:[^x]|$)
,轉換為“不遵循 'x' 或以下行開始”和“后跟沒有'x'或后跟行尾”。 但是,它仍然不會匹配只有一個字符的兩個序列(因為第一個匹配需要一個字符,第二個需要一個字符),如下所示: https : //regex101.com/r/ oC5oJ4/1
最后,要匹配一個字符的遠距離匹配,您可以在“no 'x' after”上添加一個積極的前瞻 (?=) 或在“no 'x' before”上添加一個積極的后視 (?<=),像這樣: https : //regex101.com/r/mC4uX3/1
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
這樣,您將只匹配您想要的確切數量的“x”。
看看 Enhardened 的回答,他們說他們的倒數第二個表達式不會匹配它們之間只有一個字符的序列。 有一種簡單的方法可以在不使用前瞻/后視的情況下解決這個問題,那就是用邊界字符替換開始/結束字符。 這使您可以匹配包括開始/結束在內的單詞邊界。 因此,適當的表達應該是:
(?:[^x]|\\b)(x{n}|x{m})(?:[^x]|\\b)
正如您在此處看到的: https : //regex101.com/r/oC5oJ4/2 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.