无法捕获字符串中的组

时间:2014-07-11 13:46:00

标签: regex haskell

我想以字符串形式捕获一个组:

import Text.Regex.Posix
"somestring; somestring2=\"(.*?)\"" =~ "somestring; somestring2=\"my_super_string123\"" :: String

它返回一个空字符串"",而不是我期望的my_super_string123。我已经尝试了::[String]::[[String]],显然,他们是空的。你的建议?

1 个答案:

答案 0 :(得分:2)

问题是你有你的字符串和你的模式交换。您还希望返回类型为[[String]]

> "somestring; somestring2=\"my_super_string123\"" =~ "somestring; somestring2=\"(.*)\"" :: [[String]]
[["somestring; somestring2=\"my_super_string123\"", "my_super_string123"]]

请注意,我必须从模式的?部分删除.*?This is because POSIX doesn't support the lazy quantifier *?。您必须从下拉列表中选择两种POSIX风格才能看到,但它表示两者都不支持延迟量词。它也recommended使用否定而不是懒惰来表示正则表达式,因为它可以提高性能而不必回溯。为此,您必须将模式更改为

"somestring; somestring2=\"([^\"]*)\""

澄清一下,这是GHCi的输出:

> "s1; s2=\"my_super_string123\"" =~ "s1; s2=\"([^\"]*)\"" :: [[String]]
[["s1; s2=\"my_super_string123\"","my_super_string123"]]
it :: [[String]]

> "s1; s2=\"my_super_string123\"" =~ "s1; s2=\"([^\"]*)\"" :: String
"s1; s2=\"my_super_string123\""
it :: String

1 正如您所看到的,返回类型为String,它返回与整个模式匹配的任何文本,而不仅仅是捕获组。如果要获取各个捕获组的内容,请使用[[String]]

  1. 我编辑了字符串的内容,使其无需水平滚动即可,仅用于说明目的。