h20y6m/plexpl3

[l3regex] [upTeX] 和文文字と欧文バイトがマッチしてしまう

Opened this issue · 1 comments

以下のコードでupTeXではUTF-8バイト列中の欧文バイトまで置換されてしまう。

% UTF-8で保存。
\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {±ñıűƱDZȱɱ }
\regex_replace_all:nnN {±} {*} \l_tmpa_tl
\tl_show:N \l_tmpa_tl
\ExplSyntaxOff

upTeX:

> \l_tmpa_tl=*^^c3*^^c4*^^c5*^^c6*^^c7*^^c8*ɱ.

pTeX:

> \l_tmpa_tl=*^^c3^^b1^^c4^^b1^^c5^^b1^^c6^^b1^^c7^^b1^^c8^^b1^^c9^^b1.

l3regexでは文字トークンはカテゴリコードによらずマッチするため、upTeXの場合は文字コードが128--255の和文文字と欧文バイトがマッチしてしてしまう。

interface3.pdf "8.1.2 Characters in regular expressions" より

Most characters match exactly themselves, with an arbitrary category code.

l3regex 内部では例えば ±\__regex_item_caseful_equal:n {177} のように表現されており、そこには文字コードしかないため和文と欧文を区別することができない。

l3regex ではカテゴリコードを指定したマッチもできる。これを使って和文と欧文お区別を表現で起訴だが、例えば \c[LO] A (カテゴリコード 11 (letter) または 12 (other))は \__regex_item_catcode:nT {20971520}{\__regex_item_caseful_equal:n {65}} のように表現されている。この 20971520 は $4^{11} + 4^{12}$ の意味である。このようにカテゴリコードは 4 の累乗の和で表現されているのでカテゴリコード 16 以上はオバーフローしてしまい使用できない。


【案1】\__regex_item_jachar_equal:n 等を用意し和文ならこちらを欧文なら \__regex_item_caseful_equal:n をつかう。

【案2】和文なら \__regex_item_jachar:T {...}、欧文なら \__regex_item_jachar:F {...} のようにする。


どちらにしてもマッチング時は l3tl-analysis によって文字コードとカテゴリコードを取得しているので #3 を何とかしないとどうしようもない。