Совместимые с Perl регулярные выражения с классами символов, не распознаваемыми в Haskell - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу использовать Perl-совместимые регулярные выражения в Haskell, в частности классы сокращенных символов \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?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

С 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}
0 голосов
/ 29 декабря 2018

Это не имеет ничего общего с регулярными выражениями или с Haskell vs. Python.Обратите внимание, что вы не напишите re.findall("\S+", "this is a string") либо .Вам нужно необработанные строковые литералы , чтобы использовать такие обратные слеши.Haskell не имеет встроенных необработанных строковых литералов, но у него есть квази-кавычки, которые позволяют эмулировать их .

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 даже с простыми кавычками, но это, похоже, правило возврата.Лучше не надейся на это.

...