17562


日本語を含む文字列から正規表現を使って抽出をしたいのですが、上手くいかなくて困っています。

ライブラリはregex-pcreを使っています。  
Stringではマッチする部分がずれるのか、マッチの結果の２つ目に何も入っていません。  
ByteStringではマッチする部分は取れているようなのですが、日本語のデータが抜け落ちてしまいます。

[code]

    import Text.Regex.PCRE
    "123あいうえお456かきくけこ" =~ "(\\d+)(\\D+)" :: [[String]]
    --[["123\12354\12356\12358\12360\12362\&456\12363\12365\12367\12369\12371","123","\12354\12356\12358\12360\12362\&456\12363\12365\12367\12369\12371"],["","",""]]
    import Data.ByteString.Lazy.Char8 as B
    B.pack "123あいうえお456かきくけこ" =~ "(\\d+)(\\D+)" :: [[B.ByteString]]
    -- [["123BDFHJ","123","BDFHJ"],["456KMOQS","456","KMOQS"]]
    
[/code]

また、compUTF8というオプションがあったので試してみたのですが

[code]

    let reg = makeRegexOpts compUTF8 defaultExecOpt "(\\d+)(\\D+)"
    matchAllText reg "123あいうえお456かきくけこ"
    -- [array (0,2) [(0,("123\12354\12356\12358\12360\12362\&456\12363\12365\12367\12369\12371",(0,18))),(1,("123",(0,3))),(2,("\12354\12356\12358\12360\12362\&456\12363\12365\12367\12369\12371",(3,15)))],array (0,2) [(0,("",(18,18))),(1,("",(18,3))),(2,("",(21,15)))]]
    
[/code]

となり、同様の結果のようです。

環境はUbuntu14.04($LANG=ja_JP.UTF-8)、stack0.1.5.0(ghc-7.10.2、lts-3.6)です

どうにかして日本語を含むStringかByteStringから正しくマッチさせて抽出することはできないでしょうか？  
よろしくお願いします。


CC BY-SA 3.0
2015-10-12T10:20:27.593
17557
2015-10-12T15:26:08.587
12731
question
正規表現 haskell
日本語を含む文字列から正規表現を使って抽出する方法


以下のウェブページを参照しますと、どうやら regex-pcre パッケージのバグの様です。

[[Haskell-cafe] regex-pcre is not working with
UTF-8](https://groups.google.com/forum/#!topic/haskell-cafe/I_img5sNU2A)

このページの最後の方にある[パッチ](https://groups.google.com/group/haskell-
cafe/attach/667d29e1e1ac0421/regex-
pcre-0.94.4-utf8_string.patch?part=0.1)を適用してビルド・インストールしたところ、想定通りに動作する様になりました。

[code]

    $ ghci
    
    > import Text.Regex.PCRE
    
    > let str = "123あいうえお456かきくけこ" :: String
    > let regex = "(\\d+)(\\D+)(\\d+)(\\D+)" :: String
    > let matches = str =~ regex :: MatchResult String
    
    > putStrLn $ (mrSubList matches)!!0
    => 123
    > putStrLn $ (mrSubList matches)!!1
    => あいうえお
    > putStrLn $ (mrSubList matches)!!2
    => 456
    > putStrLn $ (mrSubList matches)!!3
    => かきくけこ
    
[/code]

※ 結果が分かりやすい様に正規表現を変更しています

既にご存知かもしれませんが、以下のページに regex-pcre や regex-posix
の使用例が記載されています(今回の件では随分と参考になりました)。

[haskell-regexp-
examples/RegexExamples.hs](https://github.com/erantapaa/haskell-regexp-
examples/blob/master/RegexExamples.hs)


CC BY-SA 3.0
2015-10-12T14:49:25.507
17562
2015-10-12T15:26:08.587
2015-10-12T15:26:08.587
17557
answer