4

序章

私は Haskell のText.Regexライブラリを使用しており、通常は正規表現で意味を持ついくつかの文字に一致させたいと考えています。Text.Regexドキュメントによると、

正規表現の構文は ... egrep の構文です (つまり、POSIX の「拡張」正規表現)。

そしてどうやら、 POSIX 拡張正規表現 (ERE)でのエスケープは [ POSIX 基本正規表現 (BRE)とは異なり] バックスラッシュを使用します。


問題

ただし、次のようなことをしようとすると:

> import Text.Regex
> matchRegex (mkRegex "\*") "*"

次のエラーが表示されます。

<interactive>:1:23:
    lexical error in string/character literal at character '*'

の後にどんな文字を入れても同じことが起こり\ます。


回避策

私はこのようなことができます:

> matchRegex (mkRegex "[*]") "*"
Just []

これは機能しますが、特に複数のものを連続してエスケープしたい場合(たとえばmkRegex "[[][(][)][]]"、 which が一致する場合[()])、ハックのように思えます。


質問

これは POSIX ERE でエスケープする唯一の方法ですか? Haskell のライブラリは、本来あるべきと思われるエスケープをText.Regexサポートしていないのはなぜですか?\

4

2 に答える 2

7

構文はわかりませんが、通常、文字列内にバックスラッシュを書きたい場合は、エスケープする必要があります。つまり、次のことを意味します。

matchRegex (mkRegex "\\*") "*"

それは役に立ちますか?

于 2011-10-11T13:29:22.783 に答える
3

2 つのバックスラッシュで試してください。

matchRegex (mkRegex "\\*") "*"

GHCIで試してみたところ、うまくいきました。

于 2011-10-11T13:30:27.867 に答える