нечувствительные к регистру регулярные выражения

< E> называется параметром формального типа. Это не тип возврата метода. В основном это говорит о том, что метод может принимать в качестве параметров массивы различных типов (E [] inputArray).

8
задан Gaetan Dubar 17 June 2009 в 15:37
поделиться

3 ответа

Все модули Text.Regex. * интенсивно используют классы типов, которые используются для расширяемости и поведение, подобное «перегрузке», но сделать использование менее очевидным, просто наблюдая за типами.

Теперь вы, вероятно, начали с базового сопоставителя = ~ .

(=~) ::
  ( RegexMaker Regex CompOption ExecOption source
  , RegexContext Regex source1 target )
  => source1 -> source -> target
(=~~) ::
  ( RegexMaker Regex CompOption ExecOption source
  , RegexContext Regex source1 target, Monad m )
  => source1 -> source -> m target

Чтобы использовать ] = ~ , должен существовать экземпляр RegexMaker ... для LHS и RegexContext ... для RHS и результата.

class RegexOptions regex compOpt execOpt | ...
      | regex -> compOpt execOpt
      , compOpt -> regex execOpt
      , execOpt -> regex compOpt
class RegexOptions regex compOpt execOpt
      => RegexMaker regex compOpt execOpt source
         | regex -> compOpt execOpt
         , compOpt -> regex execOpt
         , execOpt -> regex compOpt
  where
    makeRegex :: source -> regex
    makeRegexOpts :: compOpt -> execOpt -> source -> regex

Действительный экземпляр всех этих классов (например, regex = Regex , compOpt = CompOption , execOpt = ExecOption , и source = String ) означает, что можно скомпилировать регулярное выражение с помощью compOpt, Параметры execOpt из некоторой формы источника . (Кроме того, учитывая некоторый тип regex , есть ровно один набор compOpt, execOpt , который идет вместе с ним. Однако много разных типов source приемлемы. )

class Extract source
class Extract source
      => RegexLike regex source
class RegexLike regex source
      => RegexContext regex source target
  where
    match :: regex -> source -> target
    matchM :: Monad m => regex -> source -> m target

Допустимый экземпляр всех этих классов (например, regex = Regex , source = String , target = Bool ) означает, что можно сопоставить источник и регулярное выражение для получения цели . (Другими допустимыми target s с учетом этих конкретных регулярных выражений и источника ) являются Int , MatchResult String , MatchArray и т. Д.)

Сложите их вместе, и все '

18
ответ дан 5 December 2019 в 05:03
поделиться

Я ничего не знаю о Haskell, но если вы используете библиотеку регулярных выражений на основе PCRE, то вы можете использовать модификаторы режима внутри регулярного выражения. Чтобы сопоставить "без учета регистра" без учета регистра, вы можете использовать это регулярное выражение в PCRE:

(?i)caseless

Модификатор режима (? I) отменяет любую чувствительность к регистру или параметр нечувствительности к регистру, который был установлен вне регулярного выражения. Он также работает с операторами, которые не позволяют вам устанавливать какие-либо параметры.

Точно так же (? S) включает «однострочный режим», который приводит к разрыву строк с точным соответствием, (? M) включает «многострочный режим. "что заставляет ^ и $ соответствовать разрывам строки, а (? x) включает режим свободного интервала (неэкранированные пробелы и разрывы строк вне классов символов не имеют значения). Вы можете комбинировать буквы. (? ismx) включает все. Дефис отключает параметры. (? -i) делает регулярное выражение чувствительным к регистру. (? xi) запускает регулярное выражение, чувствительное к регистру.

9
ответ дан 5 December 2019 в 05:03
поделиться

I believe cannot use (=~) if you wish to use compOpt other than defaultCompOpt.

Something like this work:

match (makeRegexOpts compCaseless defaultExecOpt  "(Foo)" :: Regex) "foo" :: Bool

The follow two articles should assist you:

Real World Haskell, Chapter 8. Efficient file processing, regular expressions, and file name matching

A Haskell regular expression tutorial

8
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: