Haskell-仅在字符串的开头匹配正则表达式(不是每行的开头!)

时间:2019-02-13 19:04:04

标签: regex haskell

我正在尝试匹配一个模式,但前提是该模式出现在字符串的开头(注意字符串的开头,而不是每一行的开头)。我发现的唯一方法是使用“`”锚点:

text =~ "\`text in the beginning"

但是对于没有匹配项的长字符串,它非常慢,我想它会尝试在整个文本中找到匹配项。

建议?

2 个答案:

答案 0 :(得分:3)

开头表示比赛的常规方法是使用^

text =~ "^text in the beginning"

您尝试过吗?如果您这样做了并且失败了,请指定您使用的是哪个regex库。我刚刚用regex-posixregex-pcre-builtin进行了验证,两者对我来说都很好。

但是,如果您真的只想匹配一个前缀,为什么不使用isPrefixOf呢?有版本for Stringfor Textfor ByteString。比正则表达式更有效。

答案 1 :(得分:-1)

成功!答案是使用非多行正则表达式。我实现了自己的匹配运算符:

(=~+) text pattern = match (makeRegexOpts blankCompOpt defaultExecOpt pattern :: Regex) text

blankComptOpt(请参阅http://hackage.haskell.org/package/regex-tdfa-1.2.3.1/docs/Text-Regex-TDFA.html#t:CompOption)将停用多行匹配。

Prelude Text.Regex.TDFA> "blahblah\nmeh" =~+ "^meh" :: Bool
False
Prelude Text.Regex.TDFA> "meh\nblahblah" =~+ "^meh" :: Bool
True

对于我较大的输入,它运行非常快。