我正在尝试匹配一个模式,但前提是该模式出现在字符串的开头(注意字符串的开头,而不是每一行的开头)。我发现的唯一方法是使用“`”锚点:
text =~ "\`text in the beginning"
但是对于没有匹配项的长字符串,它非常慢,我想它会尝试在整个文本中找到匹配项。
建议?
答案 0 :(得分:3)
开头表示比赛的常规方法是使用^
:
text =~ "^text in the beginning"
您尝试过吗?如果您这样做了并且失败了,请指定您使用的是哪个regex库。我刚刚用regex-posix
和regex-pcre-builtin
进行了验证,两者对我来说都很好。
但是,如果您真的只想匹配一个前缀,为什么不使用isPrefixOf
呢?有版本for String
,for Text
和for 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
对于我较大的输入,它运行非常快。