我想要一個匹配的正則表達式,如果一個數字大於或等於任意數字。對於這樣一個簡單的任務來說,這看起來非常複雜......似乎您需要重新爲「x」手工製作一個明確的正則表達式來重新計算「計數」。是否有一個簡單的正則表達式來比較數字與x?
例如,直觀地做到這一點的數字大於25,我得到
(\d{3,}|[3-9]\d|2[6-9]\d)
如果什麼數爲512345?有一種更簡單的方法嗎?
我想要一個匹配的正則表達式,如果一個數字大於或等於任意數字。對於這樣一個簡單的任務來說,這看起來非常複雜......似乎您需要重新爲「x」手工製作一個明確的正則表達式來重新計算「計數」。是否有一個簡單的正則表達式來比較數字與x?
例如,直觀地做到這一點的數字大於25,我得到
(\d{3,}|[3-9]\d|2[6-9]\d)
如果什麼數爲512345?有一種更簡單的方法嗎?
似乎沒有簡單的方法。正則表達式不是數字的東西。
你可以試試這個:
\[1-9]d{6,}|
[6-9]\d{5}|
5[2-9]\d{4}|
51[3-9]\d{3}|
512[4-9]\d{2}|
5123[5-9]\d|
51234[6-9]
(換行符爲清楚起見)
第一個選擇應該是'[1-9] \ d {6,}',而不是'\ d {7,}'。看到我的答案。 – 2011-12-24 06:07:09
@AlanMoore,謝謝,修復 – RiaD 2011-12-26 12:57:21
如果什麼數爲512345?有一種更簡單的方法嗎?
不,正則表達式匹配某個範圍內的數字將是一個可怕的東西(尤其是大數字範圍)。
正則表達式根本不是爲了這樣的任務。更好的解決方案是「自由」匹配數字,如\d+
,然後將它們與語言的關係運算符(<
,>
,...)進行比較。
我從來沒有聽說過可以做到這一點的正則表達式。編寫一個Perl模塊來生成適當的正則表達式(正如你在評論中提到的那樣)聽起來對我來說是個好主意。事實上,如果它尚未完成,我會感到驚訝。首先檢查CPAN。
順便說一句,除了多餘的管道Yuriy指出,你的正則表達式還包含更多的錯誤。
首先,「三個或更多個數字」部分將匹配無效號碼等024
00000007
和。你可以通過要求第一個數字大於零來解決這個問題。如果你想允許前導零,你可以分別匹配它們。
第三部分2[6-9]\d
只匹配大於等於260的數字。也許你打算讓第三個數字是可選的(即2[6-9]\d?
),但這是多餘的。
你應該以某種方式錨定正則表達式,以確保你不匹配更長的數字或帶有數字的「單詞」的一部分。我不知道在您的特定情況下做到這一點的最佳方式,但字邊界(即\b
)可能會滿足您的所有需求。
最終結果:
\b0*([1-9]\d{2,}|[3-9]\d|2[6-9])\b
在Perl中你可以使用正則表達式條件構建(?(condition)yes-pattern)
,其中(condition)
是(?{CODE})
運行任意Perl代碼。如果將yes-pattern
設爲(*FAIL)
,那麼只有當CODE
返回false時,纔會有正則表達式片段。因此:
foreach (0 .. 50) {
if (/\A(\d+)(?(?{$1 <= 25})(*FAIL))\z/) {
say "$_ matches";
}
else {
say "$_ does not match";
}
}
用於被標記爲實驗,但「perlre」手冊(http://perldoc.perl.org/perlre.html)最新的代碼評價特徵似乎暗示,現在它是一個核心的語言功能。
從技術上講,你擁有的不再是一個「正則表達式」,當然也有一些正則表達式和外部代碼的混合。
'x> 25'?我在這裏錯過了什麼? – 2011-12-23 19:58:48
爲什麼你需要用正則表達式來做這件事有什麼特別的理由嗎?爲什麼不接受任何號碼,並在稍後的階段拒絕你不喜歡的號碼? – Philippe 2011-12-23 20:01:43
在正則表達式中,你通常只需要一個''',你用的是什麼味道? – 2011-12-23 20:02:10