2013-05-06 50 views
2

我看一些老的Perl/CGI代碼調試的問題,發現很多用途:正則表達式 d匹配減號和/或小數點嗎?

\d - Match non-digit character 
\D - Match digit character 

大多數在線文檔提到\ d相同[0-9],其是我一直認爲的。但是,我也注意到提到字符集差異的Stackoverflow問題。

Does "\d" in regex mean a digit?

是否\也可爲d匹配一個減號和/或小數點?

我打算做一些測試。

+2

使用'[+ - ]?\ d +(?:\。\ d +)?'來匹配減號加號或小數點... – HamZa 2013-05-06 23:42:04

+0

我正在考慮更嚴格的事情,例如/^[0- 9] + $ /,這應該從一開始到最後一個或多個0-9匹配。 – jjwdesign 2013-05-06 23:47:13

+0

雖然你想匹配十進制(+ - )數字:p如果你只想匹配數字,那麼'/^\ d + $ /'很好。 – HamZa 2013-05-06 23:52:24

回答

7

我不知道Perl如何確定是使用Unicode還是ASCII或默認地區爲(無標記,無use)。無論如何,通過聲明use re '/a';(ASCII)或use re '/u';(Unicode)或use re '/l';(語言環境),您將清楚地向Perl解釋器(和人類閱讀器)表明您要使用哪種模式並避免意外行爲。

由於改性劑的效果,\d具有至少2名的含義:

  • /a標誌(ASCII)的效果,\d將匹配從09(不多也不少)數字。
  • /u標誌(Unicode)的效果,\d將匹配的任何語言的任何小數位,並且等同於\p{Digit}reference。這實際上使得\d+非常無用且危險,因爲它允許混合使用任何語言的數字。從/u標誌

    而且,\d+,說明

    報價可以匹配的是來自不同的書寫系統的混合數字字符串,創建一個安全問題。可以用num() in Unicode::UCD來解決這個問題。或者/a修改器可以使用到9

  • 迫使 \d匹配只是ASCII 0

\d不會匹配任何標誌或標點,因爲這些字符不屬於Nd(數字,十進制數)Unicode的General Category

+0

你認爲\ D(匹配非數字字符)是「危險使用」嗎? – jjwdesign 2013-05-07 00:12:30

+0

@ikegami:使用標誌將設置行爲。但是,默認行爲是什麼 - 如果我們不設置任何東西,Perl會從哪裏獲得設置? – nhahtdh 2013-05-07 04:13:47

+0

@jjwdesign:如果您在驗證正則表達式中使用它,那麼您想要查看它。無論您使用的是哪個標誌,\ D都將匹配Unicode字符。 – nhahtdh 2013-05-07 04:18:17

10

\ d是否也匹配減號和/或小數點?

NO

+4

+1 LOUD BREVITY – pilcrow 2013-05-07 01:02:20

+1

當我讀到這個時,我忍不住拍了他的個人資料圖片中的那個孩子說出來......哈哈 – tjwrona1992 2016-05-13 15:12:22

3

答案是否定的。它只是做一個數字檢查。但是,Unicode使事情變得更加複雜。

如果您想確定某個數字是十進制數字,請查看Scalar::Util模塊。其中的一個功能是look_like_number。這可以用來查看您正在查看的字符串是否可以是數字,並且比嘗試使用正則表達式更好。

這個模塊一直是標準Perl的一部分,所以你應該在你的系統上安裝它。

相關問題