2011-03-03 54 views
7
my $str='expire=0'; 

if ($str =~/expire\s*=\s* (?: 0[1-9]|[1-9][0-9])/){ 
    print " found it "; 
} 

它不工作爲什麼非捕獲組(?:)似乎不工作?

條件expire=應遵循1-99之間的數字?

+0

爲什麼你甚至在這種模式下使用非捕獲組? – Sam 2011-03-03 12:59:28

+0

要將「或」表達式分組......爲什麼要捕獲如果您不需要提取它? – 2011-03-03 14:38:33

+0

什麼「或」表達? – Sam 2011-03-24 08:33:20

回答

11

您正則表達式中有空格,刪除它們:

/expire\s*=\s* (?: 0[1-9]|[1-9][0-9])/ 
      ^^

而且正則表達式0[1-9]|[1-9][0-9]不匹配0

編輯:

根據您的意見,您希望允許從1-99一些expire=後,所以你可以使用:

/^expire\s*=\s*(?:[1-9]|[1-9][0-9])$/ 

或較短的版本:

/^expire\s*=\s*(?:[1-9][0-9]?)$/ 

由於你的例子在expire=之後有0它不會不匹配。

另請注意,我已經添加了開始和結束錨點。沒有它們,正則表達式可能會匹配輸入的任何有效子字符串。例如,它可以在輸入expire=999

+0

仍然不工作? – Tree 2011-03-03 13:01:40

+0

'expire =' – codaddict 2011-03-03 13:03:06

+0

後應該只允許1-99 – Tree 2011-03-03 13:06:38

2

匹配expire=99您有第二\ S *和非捕獲組的開始之間的空間。試試這個:如果你想使用的空間在您的正則沒有他們真正匹配空間

~/expire\s*=\s*(?:0[1-9]|[1-9][0-9])/ 
+0

還是不匹配? – Tree 2011-03-03 13:01:19

6

,您需要使用x修改你的正則表達式。即/ foo /x匹配字符串「foo」,而/ foo /只匹配「foo」。

+0

不錯的提示,但我會說這使得正則表達式一目瞭然難以閱讀。 – 2011-03-03 12:45:38

+2

@Josh在現實世界中嘗試它,形式複雜。很高興能夠分離相關的比特,甚至可以在線上劃分它:) – hobbs 2011-03-03 12:48:40

+0

@ hobbs我做到了!無論哪種方式工作... – 2011-03-03 22:14:38