標点符号の処理
GSUB 方式
ROMAN_GSUB_PATTERNS = {
/,/ => ' , ',
/\./ => ' . ',
/!/ => ' ! ', # 感嘆符前後に空白
/\?/ => ' ? ',
}
text = "suà-lo̍h,lâi-khuànn"
ROMAN_GSUB_PATTERNS.each do |pattern, replacement|
text = text.gsub(pattern, replacement)
end
特徴: 記号を空白で囲む → 後で split
Parslet 方式
rule(:punctuation) do
str('...') | str('⋯⋯') | str('……') | # 複数文字優先
match[',.:;()!??!/~、─…⋯'] |
match["\"'\u201C\u201D\u2018\u2019"] | # 引用符 ( いんようふ )
match['\u3000-\u303F'] # CJK記号
end
# Token 規則
rule(:token) do
hyphenated_word.as(:word) |
punctuation.as(:punct)
end
入力: "suà-lo̍h,lâi-khuànn"
出力(AST):
[
{ word: "suà-lo̍h" },
{ punct: "," },
{ word: "lâi-khuànn" }
]
特徴: Token として構造化 → split 不要