Haskell正则表达式语法

时间:2012-01-15 19:51:40

标签: regex haskell

编辑:正在运行的正则表达式(采取第二组):

(^|[ ,\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解析器的处理方式与“^”和“$”不同,但这就是我所拥有的。

3 个答案:

答案 0 :(得分:3)

在像[^ \t\n,]这样的字符类中,正常的正则表达式元字符(例如^$)会失去它们的特殊含义;他们匹配自己。 1 (^|[ \t\n,])这样的东西应该做你想要的。

我很惊讶你的正则表达式在Scala中起作用;我从来没有见过不以这种方式运行的正则表达式实现。

1 虽然正如FlopCoder指出的那样,^在字符类的开头实际上否定

答案 1 :(得分:3)

^[内的符号]表示。在[]之间使用此排除其他字符。如果您希望正则表达式与起始匹配,请将^放在正则表达式的最开头。

$也是如此,如果你想用它作为字符串的结尾。

答案 2 :(得分:1)

这个"[^ \t\n,]+([0-9\\.])+[$ \t\n,]+"匹配一个非空的字符序列,它们不是' ', '\t', '\n', ',']贪婪的,一个非空的数字或点序列,以及任何"$ \t\n,"的非空序列,捕获倒数第二个的序列。第一个匹配" 12.3",第二个/倒数第二个匹配"4"