2

私は現在、別の文字列で特定の文字列のインデックスを見つけようとしています。たとえば、string "ab"inの結果は"ababa baab ab bla ab"11と18になります。現在、私の関数でインデックス0と8も取得するという問題がある場合は、次のようになり
ます。

findSubstringIndices :: String -> String -> [Int]
findSubstringIndices text pattern = map (add 1) (findIndices (pattern `isPrefixOf`) (tails text))
4

3 に答える 3

1
findWordIndices' :: String -> String -> [Int]
findWordIndices' w = snd . foldl doStuff (0, []) . words
  where
    doStuff (cur, results) word =
        if word == w 
        then (cur + length word + 1, cur : results) 
        else (cur + length word + 1, results)  

ただし、これはインデックスを逆順で返します。

g>let str = "ababa baab ab bla ab"
str :: [Char]
g>findWordIndices' "ab" str
[18,11]
it :: [Int]

(++)これは、cons ( ) の代わりに使用することで修正できます(:)

findWordIndices'' :: String -> String -> [Int]
findWordIndices'' w = snd . foldl doStuff (0, []) . words
  where
    doStuff (cur, results) word =
        if word == w 
        then (cur + length word + 1, results ++ [cur]) 
        else (cur + length word + 1, results)

g>let str = "ababa baab ab bla ab"
str :: [Char]
g>findWordIndices'' "ab" str
[11,18]
it :: [Int]
于 2012-07-11T15:59:21.853 に答える
0

の別のバリエーションwords:

import Data.Char
import Control.Arrow

words' s = 
  case dropWhile isSpace' s of
    [] -> []
    s' -> ((head >>> snd) &&& map fst) w : words' s'' 
          where (w, s'') = break isSpace' s'
  where isSpace' = fst >>> isSpace

indices text pattern =
  map fst $ filter (snd >>> ((==) pattern)) $ words' $ zip text [0..]

main = do
  putStrLn $ show $ indices "ababa baab ab bla ab" "ab"
于 2012-07-11T16:00:29.133 に答える