🦁
Mark/d/own to h/tml
PenCakeという日記アプリのパーサーを書いていて、改行コードへの無知のためにハマった話です。
覚え書きなので文章としてはグダグダです。
です
本文
まずこんな内容のテキストファイルがあって、
Hello
Mon, Dec 20, 2021 6:25 PM
Hello, Pencake!
...
...
この3つの要素(上から順にタイトル、日時、本文)を別々に取り出したくて、
(.*)\n\n(.*)\n\n([\s\S]*)
こんなパターンを書いたが、マッチしない。
紆余曲折の後、Xcodeのデバック機能でランタイム上のテキストを表示させてみると、改行文字が\n
ではなくて\r\n
の2文字になっているのを発見。
調べてみると、改行コードは\n
だけじゃなくて、以下の3種類があるらしいということがわかった。
名前 | 記号 | 意味 | OS |
---|---|---|---|
LF(Line Feed) | \n |
キャレットを左端へ戻す | UNIX系全般 |
CR(Carriage Return) | \r |
キャレットを次の行に移す | 旧MacOS |
CRLF(CR + LF) | \r\n |
キャレットを左に戻してから次の行へ移動 | Windows系全般 |
どうやらそのアプリの使用上、エクスポートしたファイルの改行コードはCRLFになるようだった。iOSアプリなんだったらLFにしてくれや。
なので改行コードが上記のいずれであっても正確にマッチするように、2つ連続した改行コードは
(\n{2}|(?:\r\n){2})
と表せるので、結果的に
(.*?)(\n{2}|(?:\r\n){2})(.*?)\\2([\\s\\S]*)
として解決。
追記
このNSRegularExpressionのラッパーライブラリが便利です。
参考リンク
env
ERB
_
<!DOCTYPE html>
<html>
<head>
<title>Sample</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
Discussion