2011-12-23 56 views
0

我想要一個匹配的正則表達式,如果一個數字大於或等於任意數字。對於這樣一個簡單的任務來說,這看起來非常複雜......似乎您需要重新爲「x」手工製作一個明確的正則表達式來重新計算「計數」。是否有一個簡單的正則表達式來比較數字與x?

例如,直觀地做到這一點的數字大於25,我得到

(\d{3,}|[3-9]\d|2[6-9]\d) 

如果什麼數爲512345?有一種更簡單的方法嗎?

+3

'x> 25'?我在這裏錯過了什麼? – 2011-12-23 19:58:48

+1

爲什麼你需要用正則表達式來做這件事有什麼特別的理由嗎?爲什麼不接受任何號碼,並在稍後的階段拒絕你不喜歡的號碼? – Philippe 2011-12-23 20:01:43

+1

在正則表達式中,你通常只需要一個''',你用的是什麼味道? – 2011-12-23 20:02:10

回答

3

似乎沒有簡單的方法。正則表達式不是數字的東西。
你可以試試這個:

\[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] 

(換行符爲清楚起見)

+0

第一個選擇應該是'[1-9] \ d {6,}',而不是'\ d {7,}'。看到我的答案。 – 2011-12-24 06:07:09

+0

@AlanMoore,謝謝,修復 – RiaD 2011-12-26 12:57:21

3

如果什麼數爲512345?有一種更簡單的方法嗎?

不,正則表達式匹配某個範圍內的數字將是一個可怕的東西(尤其是大數字範圍)。

正則表達式根本不是爲了這樣的任務。更好的解決方案是「自由」匹配數字,如\d+,然後將它們與語言的關係運算符(<,>,...)進行比較。

1

我從來沒有聽說過可以做到這一點的正則表達式。編寫一個Perl模塊來生成適當的正則表達式(正如你在評論中提到的那樣)聽起來對我來說是個好主意。事實上,如果它尚未完成,我會感到驚訝。首先檢查CPAN。

順便說一句,除了多餘的管道Yuriy指出,你的正則表達式還包含更多的錯誤。

  • 首先,「三個或更多個數字」部分將匹配無效號碼等02400000007和。你可以通過要求第一個數字大於零來解決這個問題。如果你想允許前導零,你可以分別匹配它們。

  • 第三部分2[6-9]\d只匹配大於等於260的數字。也許你打算讓第三個數字是可選的(即2[6-9]\d?),但這是多餘的。

  • 你應該以某種方式錨定正則表達式,以確保你不匹配更長的數字或帶有數字的「單詞」的一部分。我不知道在您的特定情況下做到這一點的最佳方式,但字邊界(即\b)可能會滿足您的所有需求。

最終結果:

\b0*([1-9]\d{2,}|[3-9]\d|2[6-9])\b 
1

在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)最新的代碼評價特徵似乎暗示,現在它是一個核心的語言功能。

從技術上講,你擁有的不再是一個「正則表達式」,當然也有一些正則表達式和外部代碼的混合。