Как экранировать символы в библиотеке Text.Regex на Haskell? - PullRequest
4 голосов
/ 11 октября 2011

Введение

Я использую библиотеку 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 "[[][(][)][]]", что соответствует [()]).


Вопрос

Это единственный способ сбежать вPOSIX ERE?Почему библиотека Text.Regex на Haskell не поддерживает \ так, как кажется?

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

Я не знаю синтаксис, но обычно, если вы хотите написать обратную косую черту внутри строки, вам нужно ее экранировать, что означает:

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

Помогает ли?

3 голосов
/ 11 октября 2011

Попробуйте с двумя обратными слешами:

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

Я только что попробовал это с GHCI, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...