Split string:サロゲートペアと異体字セレクターに対応していない

R6から追加されたので早速テストしてみました。 :mrgreen:

セパレータに空文字をわたすと文字を分割してくれると書いてあったのでその通りにやってみたのですが
サロゲートペアと異体字セレクターの文字は文字化けしてしまいました。

正しく分割できる方が望ましいです。
またセパレータには、正規表現が記載できるとありがたいです。 :pray:

本当は、$word_t[[1]]でサロゲートペアと異体字セレクターの文字も1文字として扱えれば良いのですが…

サロゲートペアと異体字セレクターですが、正規表現で正しく分割できるみたいです。
[]22682670;“Your comment here…”[/]

サロゲートペアに問題を限定してバグ報告させていただきました。ACI0097923

$mySurrogatePair:=Char(0xD801)+Char(0xDC37)
$t:=$mySurrogatePair*3

C_COLLECTION($cc)
$cc:=New collection
$i:=1

C_LONGINT($pos;$len)
While (Match regex("\X";$t;$i;$pos;$len))
$cc.push(Substring($t;$pos;$len))
$i:=$pos+$len
End while

確かにどちらも正規表現であれば回避できるのですが,
4Dは仕様として異体字セレクターをサポートしていないので,
これをバグに含めると,バグがバグではなくなってしまうためです。
(注記で異体字セレクターに言及しました)

ご報告ありがとうございます。

: Keisuke MIYAKO

4Dは仕様として異体字セレクターをサポートしていないので,
これをバグに含めると,バグがバグではなくなってしまうためです。
(注記で異体字セレクターに言及しました)

異体字セレクターが考慮されない対応だと中途半端ですね。
それだと正規表現で分割できる方向で対応していただいた方がありがたいです。 :pray:
最悪こちらで対応可能なので。

開発部から回答がありました。

http://doc.4d.com/4Dv16R6/4D/16-R6/Split-string.301-3644822.ja.htmlドキュメント>で「1文字ずつ(原文: each character)」と述べており,これが仕様である,とのことでした。

「文字」=Char()=コードポイント,という意味のようです。

グラフィームクラスター分割には,やはり,明示的にMatrch regex()を使用しなければならないようです。

: Keisuke MIYAKO

開発部から回答がありました。

http://doc.4d.com/4Dv16R6/4D/16-R6/Split-string.301-3644822.ja.html
ュメント>で「1文字ずつ(原文: each character)」と述べており,これが仕様である,とのことでした。

「文字」=Char()=コードポイント,という意味のようです。

グラフィームクラスター分割には,やはり,明示的にMatrch regex()を使用しなければならないようです。

現在の仕様としてはそうですよね。 :mrgreen:

それでは改めてフィーチャーリクエストでお願いいたします。
javascriptのsplitですら正規表現が可能です。使えない方が不思議だと思います。

こんな感じでできないでしょうか?
<code 4D>
$col:=Split string($vt;",(?=([^"]"[^"]")[^"]$)";sk Split is Regex)

</code 4D>

宜しくお願い致します。 :pray:

「正規表現でテキストを分割したい」

Feature Requestを作成しました:http://forums.4d.com/Post//22944477/1/

ご登録ありがとうございます。

すぐには採用されないと思うのでカバーメソッド作ってみました。

<code 4D>
//_Split_string(stringToSplit_t;separator_t{;option_l})→collection
//option_l to 4 is split on regex. other options execute the split string command.
C_TEXT($1;$2;$word_t;$separator_t)
C_LONGINT($3;$option_l)

$word_t:=$1
$separator_t:=$2
$option_l:=Choose(Count parameters=3;$3;0)

If ($option_l=4) //split on regex
C_COLLECTION($word_c)
C_LONGINT($start_l;$cnt_l;$pos_l;$length_l)
C_BOOLEAN($match_b)
$start_l:=1
$cnt_l:=0
$word_c:=New collection
Repeat
$match_b:=Match regex($separator_t;$word_t;$start_l;$pos_l;$length_l)
If ($match_b)
$word_c[$cnt_l]:=Substring($word_t;$pos_l;$length_l)
$cnt_l:=$cnt_l+1
$start_l:=$pos_l+$length_l
End if
Until ($match_b=False)
$0:=$word_c

Else //other
$0:=Split string($word_t;$separator_t;$option_l)
End if
</code 4D>