文字列が空行か調べる
テキスト処理において「行」は行末以外には「改行」を含まず,行末の「改行」によって終端されている文字列のことです.
したがって,最も狭義の「空行」は「改行」だけを含む文字列です.
[*** Text版]
インポート
code: (haskell)
import Data.Char
import Data.Text (Text)
import qualified Data.Text as T
[** isEmptyLine :: Text -> Bool]
code: (haskell)
isEmptyLine :: Text -> Bool
isEmptyLine = ("\n" ==)
広義の空行
「空白」だけを含む「行」も「空行」とみなすことにするなら,以下のような述語を定義できます.
code: (haskell)
isWhiteLine :: Text -> Bool
isWhiteLine txt = case T.break ('\n' ==) txt of
(tx,ux) -> case T.uncons ux of
Nothing -> False -- 改行を含まないなら「行」ではない
Just (_,vx) -> T.null vx -- 最後尾の文字が唯一の改行文字('\n')
&& T.all isSpace tx -- かつ改行文字より前がすべて空白文字
ここでisSpace :: Char -> BoolはData.Charで定義されている述語です.
対象の文字がUNICODEの空白文字,あるいは,'\t','\n','\r','\f','\v'のいずれかであれば,Trueになります.
したがって,いわゆる全角空白'\12288' も空白とみなします.
[*** String版]
Text版と同様
code: (haskell)
isEmptyLine' :: String -> Bool
isEmptyLine' = ("\n" ==)
isWhiteLine' :: String -> Bool
isWhiteLine' str = case break ('\n' ==) str of
(ss,ts) -> case ts of
[] -> False -- 改行を含まない文字列は「行」ではない
_:us -> null us -- 最後尾の文字が唯一の改行文字('\n')
&& all isSpace ss -- 改行文字より前がすべて空白文字
評価例
code:_
>> :set -XOverloadedStrings
>> emptyline = "\n"
>> whiteline = " \t \n"
>> whites = " \n "
>> isEmptyLine emptyline
True
>> isEmptyLine whiteline
False
>> isEmptyLine whites
False
>> isWhiteLine emptyline
True
>> isWhiteLine whiteline
True
>> isWhiteLine whites
False
>> isEmptyLine' emptyline
True
>> isEmptyLine' whiteline
False
>> isEmptyLine' whites
False
>>
>> isWhiteLine' emptyline
True
>> isWhiteLine' whiteline
True
>> isWhiteLine' whites
False