2014-02-20 54 views

回答

3

這是一個非常糟糕的主意。不是不可能的,但很難寫成一個通用的解決方案。

讓我們寫一個匹配2123之間的所有數字的正則表達式。我們必須分別查看每個可能的數字。

  • 1位:[2-9] - 2或更大
  • 2位數:[1-9][0-9] - 任何兩位數字
  • 3位數:[1](?:[0-1][0-9]|[2][0-3]) - 無論是任何3位數字高達119,或12x其中0 <= x <= 3

一起:/\A(?:[2-9]|[1-9][0-9]|[1](?:[0-1][0-9]|[2][0-3]))\z/

這是可讀或維護?當然不是。

你可以使用嵌入式代碼:/\A([0-9]+)(?(?{ not($x <= $^N && $^N <= $y) })(*F))\z/,但是這是相當愚蠢的爲好。

最好的解決方案是使用代碼應該如何處理代碼來完成。正則表達式在這裏根本就不是一個合適的工具。

my ($num) = $string =~ /\A([0-9]+)\z/ or die "no number in \$string"; 
if (not($x <= $num and $num <= $y)) { 
    die "Number $num out of range [$x .. $y]"; 
} 
+0

'除非($ X <= $ NUM && $ NUM <= $ Y){...}' – Qtax

+0

@Qtax我知道 - 但我不使用'unless'任何更多的風格決定。 – amon

+0

但你在'if's中使用'和'? ;) – Qtax