Q5:文字(ABC)を読み出す時、または書き込む時にその文字を("ABC")のように(””)で囲む形で操作したい。
Q5-1:
テキストボックスの文字列の操作:
文字(ABC)を読み出す時、または書き込む時にその文字を("ABC")のように(””)で囲む形で操作したい。簡便に(””)と付けたり外したりする方法がありますか(例えば関数とかで)?
サンプルプログラムから学んだ操作:
バッチファイルではなく「c:\2.1\MZPLoader.exe "abc.mzax"」 のような文字列を作りたいときに
@テキストボックス(text1)に abc.mzax を表示します。[テキストフィールド]
A @text1 の内容の右端に(”)を文字列連結でつけます。[文字列格納変数:連結置換]
同様に、
B Aの左端に(”)を文字列連結で付けます。
C 文字列(c:\2.1\MZPLoader.exe)の右端に(sp)半角スペースを付けます。
D 文字列C と 文字列B を連結して目的の文字列が作成できました。
この操作は ”” や スペース を連結して文字列を作り出していますが面倒な作業ですのでAとBを同時に実行できる手法がありましたらご教示ください。
A5-1:
「メソッド:replaceAll(string,string)」(該当文字列を全部置換)や「replaceFirst(string,string)」(該当文字列の最初に出現するものを置換)を使うことが考えられます。
但し、置換え文字列に特殊文字が含まれている場合はエラーが発生するので、予めエスケープ文字を「¥」付与する必要が出てきてしまいます。
また、両側の文字列のみ削除する場合には「メソッド:指定インデックス間の部分文字列に置き換える」も有効です。(replaceAllを使った時は全部の「"」が置き換えられてしまいます)
ご参考までに関連ファイルをご覧下さい。
なお、replaceメソッドには「ThenReplace」の付いたものがあります。
@replaceAll 文字列格納変数の中の文字列はそのまま結果はその後の接続で「取得方法:メソッド処理結果」で取得
AreplaceAllThenReplace 文字列格納変数の中の文字列も置き換わるといった違いがあります。
関連ファイル:replace.mzax (※このファイルは、ZIP形式に圧縮してあります。)
Q5-2:
手順と動作は理解できたのですが文字列のReplaceで 「固定値:1と18の組合せで両端から1文字づつ削除される」ところが理解できないでおります。文章では、うまく説明できないのでお手数でも、関連ファイルのシートをみてください。単に、1、18とは 「2文字目から18文字目まで」との意味でしょうか?JAVAのヘルプを見に行きましたがどこにあるのか良くわかりませんでした。関連ファイルのシート
「c_部分文字列」よろしくお願いします。
関連ファイル:文字列加工1.xls
A5-2:
インデックスは通常0から開始します。
「"MZ""Platform""研究会"」の場合、インデックスは「0−18」で、文字列の長さは「19」です。
「メソッド:指定インデックス間の部分文字列に置き換える(int,int)」は<引数0>の数字(開始インデックス)はそのインデックスの文字を含みますが、<引数1>の数字(終了インデックス)は含みません。
従って、「"MZ""Platform""研究会"」の例ではインデックス0の「"」とインデックス18の「"」を含めない「1〜18」の指定となります。
Q5-3:
戴いたサンプルの操作中に疑問に思ったことがあります。「特殊文字」に関することと思いますが
@ ””を付けたい文字列の文字を変えていると時々エラーが出ます。1度でると前に正常であったものがエラーになったり、「/」が無くなったり残ったりします。この原因は”XXX"を理解すればわかるのかな..と思っています。
A replace.mzax の中の 置換用文字列 ”XXX”:の解説はどのようにすれば見つけられるでしょうか?もしJava 牽引に無ければ、MZPを理解するのに適当なJavaの参考書の紹介を戴きたくお願いします。
B 関連ファイルは@Aの状況です。
また ”XXX"を使用したプログラムであるときまではC「"c:\abc\def\gh.mzax"」作成してから1週間位はこのようにdirectory付で表示されていたものが突然D「"c:abcdefgh.mzax"」のようにdirectoryの表示がなくなってしまいました。(CとDの間では起動・停止を繰り返しただけ?との認識ですが)このあとは何回起動してもCの表示は出なくなりました。これも上記の@Aと同じ内容かと思ってます。
関連ファイル:文字列加工2.xls
A5-3:
[文字列格納変数]の「メソッド:replaceAll」等はJavaの正規表現に基づいて、マッチした部分文字列を置換しています。
JAVAのpatternクラス、Matcherクラスについては下記のURLをご覧下さい。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/regex/Pattern.html
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/regex/Matcher.html
「$」等の特殊な文字は正規表現で使われていますので、「文字」ではなく「正規表現(の一部)」と見なされ、置換え文字にそれを含むとエラーとなります。
それを回避するために「¥」(MZPlatform 上では「バックスラッシュ」で表示されます)を付与する必要があります。
例えば「$」ではエラーですが「\$」とすると「$」と認識されます。
「\」を認識したい場合は「\\」となります。
最初に置換対象の文字列を「"XXX"」としたのはちょっと適当ではなかったかも知れません。このXXXの部分はどんな文字列でも良く、またうまく正規表現を使うと、固定の文字列ではなく正規表現のパターンにマッチするものを置換することも可能です。
例:@文字列格納変数に「1a2b3c」を設定
AreplaceAll「被置換文字列:\d(=数字を表します)」「置換文字列:A」
B結果「AaAbAc」
なお、ファイル名が変わってしまったということですが、Cドライブ直下に知らずに保存してしまったということはないでしょうか。
ご確認頂いた後でも、やはりパスが表示されないようであれば、こちらでも調査いたしますので、どうぞ再度ご連絡ください。
Q5-4:
今回解説戴いた例は理解できました。
@ ”XXX” のXの数について
”X”、”XX”、”XXXX” では、置換が行われずにどのルールで、”XXX”(3ヶのX)が置換されるのでしょうか?
A ファイル名が変わったのではなく置換前の文字(abc\def\g)は同じでも置換後の文字が
[1] あるときまで(abc\def\g)
[2] あるときから(abcdefg)
となったという意味です。
1つ前のVersion([1])でも再現できない状態(常に[2])なのでこの件は、懸案なしとしてください。
A5-4:
@最初に[文字列格納変数]に設定する文字列は任意です。
「X」でなくて構いません。その後のreplaceAllの置き換え対象文字列にこの設定した文字列を使用します。
この時一致しないと置き換えられませんので、最初に設定した文字列とreplaceAllで指定している文字列と違う可能性はないでしょうか。
A文字列の中に「\」が含まれている時、このままReplaceAllの置換文字列として使うと、正規表現として見なされる可能性があります。
これを回避するにはreplaceする前に「¥」の数を2つに増やしておく必要があります。
簡単にサンプルを作りましたので、ご参考になれば幸いです。
関連ファイル:replace(特殊文字使用).mzax (※このファイルは、ZIP形式に圧縮してあります。)
Q5-5:
ありがとうございました。
@"XXX" と XXX の2箇所を入力するところでご指摘のように、"XX" と XXX と片方しか変更していませんでした。ご迷惑をお掛けしました。特殊文字の入替え方のサンプルをありがとうございました。文字化けする文字を自動的に認識して変換・復元に使えるような組込みされた関数はありますか。
A5-5:
replaceAll、replaceFirstは置換文字列を正規表現として認識するようになっています。simpleReplaceAllあるいはsimpleReplaceFirstは置換文字列を通常の単純な文字列として扱い、replaceを行います。