2011-04-08 11 views
16

Haskell'de düzenli ifadeler kullanarak bir dizeyi nasıl ayırım? Olay bir maç yapar ama x O x "xyz" yani sadece ilk regex grubunu ayıklamak nasıl "xyz abc" olarak biterhaskell düzenli ifadelerde gruplandırma

let x = "xyz abc" =~ "(.*) .*" :: String 

almaz

let x = "xyz abc" =~ "(\\w+) \\w+" :: String 

?

cevap

18

Ben regex-base, regex-pcre ve regex-tdfa gibi paketler korumak/yazdı. Normal ifadede, Text.Regex.Base.Context modülü, = ~ kullanan RegexContext örneğinin çok sayıda örneğini belgelemektedir. Bunlar, matchText ve matchAllText öğelerini çağırmanın temel yolunu sağlayan RegexLike'un üzerine uygulanır.

KennyTM'den bahsettiğimiz [[String]] RegexContext'in başka bir örneğidir ve sizin için en uygun olan veya olmayabilir. Point x grup maçları Dizi Int maçların bir Array Int

let x :: Array Int (MatchText String) 
    x = getAllTextMatches $ "xyz abc" =~ "(\\w+) \\w+" 

At which: Kapsamlı bir örneği her şey için bir MatchText almak için kullanılabilir

RegexContext a b (AllTextMatches (Array Int) (MatchText b)) 

type MatchText source = Array Int (source, (MatchOffset, MatchLength)) 

olduğunu.

"\ w" ifadesinin Perl sözdizimi olduğunu ve bu nedenle ona erişmek için regex-pcre'ye ihtiyacınız olduğunu unutmayın. Unix/Posix'in normal ifadeler kullanmasını istiyorsanız, çapraz platform olan regex-tdfa'yı kullanmalı ve regex.h kütüphanesinin uygulanmasında her bir platformun hatalarına vuran regex-posix kullanmaktan kaçınmalısınız.

Perl vs Posix'in "\ w" gibi bir sözdizimi meselesi olmadığını unutmayın. Çok farklı algoritmalar kullanırlar ve sıklıkla farklı sonuçlar verirler. Ayrıca, zaman ve uzay karmaşıklığı çok farklı. Bir uzunluğa ('n') karşılık gelmek için Perl stili (regex-pcre) zaman içinde O (exp (n)) olabilirken, regex-posix kullanan Posix stili her zaman O (n) olur.

13

Sonucu [[String]] olarak döküm. Daha sonra her biri eşleşen metnin ve yakalanan alt grupların listesi olan eşleşmelerin bir listesini alırsınız.

Prelude Text.Regex.PCRE> "xyz abc more text" =~ "(\\w+) \\w+" :: [[String]] 
[["xyz abc","xyz"],["more text","more"]]