我想以字符串形式捕获一个组:
import Text.Regex.Posix
"somestring; somestring2=\"(.*?)\"" =~ "somestring; somestring2=\"my_super_string123\"" :: String
它返回一个空字符串""
,而不是我期望的my_super_string123
。我已经尝试了::[String]
和::[[String]]
,显然,他们是空的。你的建议?
答案 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]]
。