代码之家  ›  专栏  ›  技术社区  ›  Mittenchops

Haskell中无法识别字符类与Perl兼容的正则表达式

  •  0
  • Mittenchops  · 技术社区  · 5 年前

    我希望在haskell中使用与Perl兼容的正则表达式,特别是短手字符类 \w \s 等。

    我了解标准POSIX模块中没有这些功能:

    import Text.Regex.Posix
    
    "this is a string" =~ "\S+"
    
    <interactive>:3:25: error:
        lexical error in string/character literal at character 'S'
    

    但是,我希望PCRE包能够处理此问题,但看到的结果相同:

    import Text.Regex.PCRE
    
    "this is a string" =~ "\S+"
    
    <interactive>:2:25: error:
        lexical error in string/character literal at character 'S'
    

    在Python中,它的工作方式如下:

    >>> import re
    >>> re.findall(r'\S+', "this is a string")
    ['this', 'is', 'a', 'string']
    

    如何在Haskell中使用这些regex字符类?

    2 回复  |  直到 5 年前
        1
  •  2
  •   leftaroundabout    5 年前

    这与regex或haskell与python无关。注意你不会写 re.findall("\S+", "this is a string") 任何一个 阿西 . 你需要 原始字符串文本 像这样使用反斜杠。Haskell没有内置的原始字符串文字,但它确实有允许你使用的准Quoter。 emulate them .

    Prelude> :set -XQuasiQuotes 
    Prelude> :m +Text.RawString.QQ Text.Regex.PCRE
    Prelude Text.RawString.QQ Text.Regex.PCRE> "this is a string" =~ [r|\S+|] :: String
    "this"
    

    或者,只需两次避开反斜杠: "this is a string" =~ "\\S+"


    阿西 事实上,单反斜杠版本在Python中甚至可以使用简单的引号,但这似乎是一个回退规则。最好不要依赖这个。

        2
  •  2
  •   Andie2302    5 年前

    使用posix,您可以使用:

    \w ...  [\p{L}\p{M}\p{Nd}\p{Nl}\p{Pc}]
    \W ...  [\p{L}\p{M}\p{Nd}\p{Nl}\p{Pc}]
    \s ...  [[:space:]]
    \S ...  [^[:space:]]
    \d ...  [[:digit:]]
    \D ...  [^[:digit:]]
    

    使用PCRE软件包,您可以使用:

    \w ...  [\p{L}\p{M}\p{Nl}\p{Nd}\p{Pc}]
    \W ...  [^\p{L}\p{M}\p{Nl}\p{Nd}\p{Pc}]
    \s ...  [\p{Z}\t\n\cK\f\r\x85]
    \S ...  [^\p{Z}\t\n\cK\f\r\x85]
    \d ...  \p{Nd}
    \D ...  \P{Nd}