2012-01-15 60 views
0

編輯:一個工作正則表達式(以第二組):哈斯克爾正則表達式語法

(^|[ ,\t\n]+)([0-9\\.]+)($|[ ,\t\n]+) 

原帖:

我是新來的Haskell,欲以Text.Regex(從regex- compat)從字符串中提取浮點值。我希望我的正則表達式匹配由至少一個分隔符字符向左和向右緩衝的任何一系列數字和句點。這是我寫的:

regex = "[^ \t\n,]+([0-9\\.])+[$ \t\n,]+" 

編輯:我本來以爲這工作正常Scala中,但現在我相信,我只是很幸運我的測試字符串。這在Haskell中不起作用。舉個例子:

matchRegexAll (mkRegex regex) " 12.34 " 

產生

Just (" ","12.34 ","",["4"]) 

時,在我看來,它應該產生

Just (""," 12.34 ","",["12.34"]) 

又如:

matchRegexAll (mkRegex regex) "12.34" 

產量

Nothing 

當我覺得它應該產生

Just ("","12.34","",["12.34"]) 

我猜分析器把「^」,並且不Scala的解析器「$」不同,但這是我的一切。

+2

如果斯卡拉做你期望與該正則表達式,該正則表達式引擎必須被打破。 – kennytm 2012-01-15 19:56:23

回答

3

在像[^ \t\n,]這樣的字符類中,正常的正則表達式元字符(例如^$)會失去其特殊含義;他們相反自己。 像(^|[ \t\n,])應該做你想做的。

我很驚訝你在Scala的正則表達式工作;我從來沒有見過一種不以這種方式表現的正則表達式實現。

雖然作爲FlopCoder指出,^在字符類的開始其實否定它。

+0

我認爲''[^ \ t \ n,]'是指一切,但不是空格,製表符,換行符或逗號。這在Ruby中有效,並且我的Regexp語法最爲人所知。 – Hauleth 2012-01-15 20:20:44

3

[]內部的符號^意味着不是。使用此不包括[]之間的其他字符。如果你想讓正則表達式與起始匹配,在正則表達式的最開始處放^

如果你想用它作爲字符串的結尾,那麼$也是一樣的。

1

"[^ \t\n,]+([0-9\\.])+[$ \t\n,]+"此匹配其是沒有的' ', '\t', '\n', ',']貪婪地,數字或點的非空序列,以及任何"$ \t\n,"一個非空序列字符的非空序列,捕獲序列的倒數第二個。首先匹配" 12.3",第二個/倒數第二個只剩下匹配"4"