「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@51) [中] [調査中]
@51■ (#122) 囲みトリムが囲み記号以外の文字も消去してしまう - mr (2008-10-05 00:50) /低 未処理

【症状】
 「囲みトリム」が囲み記号ではないと思われる文字も消去してしまう

【再現方法】
 #サンプルソース
 「しんぶんし」から囲みトリムして表示  #⇒「んぶん」

【要望】どのような解決が望ましいか?
 囲み記号ではないものは消去しない。(囲み記号の定義が別途必要)

【バージョン】1.508

(#124) Re: 囲みトリムが囲み記号以外の文字も消去してしまう - しらたま (2008-10-05 12:51) /低 調査中
うーん、私は今の挙動でも良いと思っているのですが、確かに命令の説明文からすると、囲み記号以外のものを削除するのは不適当と感じます。
しかし、今更挙動を変えて、現在の挙動に依存しているコードはどうするのかということと、ご指摘のように、囲み記号の定義をどうするのかという問題があります。

そこで、少し考えたのですが、新たに「囲みトリム開始文字」と「囲みトリム終了文字」という2つの配列をシステム変数として定義、それぞれの対応する添え字の要素を囲み記号として扱う。どちらかが未定義(=空)ならば現状の挙動とする、という風にして、初期値を空にしておくというのはどうでしょうか。
これなら、互換を保ったまま、囲み文字のみを消すという挙動も実現できると思います。
このアイデアはいかがでしょうか、ご意見お願いします。

(#126) RE:Re: 囲みトリムが囲み記号以外の文字も消去してしまう - mr (2008-10-05 10:19) /低 調査中
こんにちは。レスありがとうございます。

どうですかね~。囲みトリムって、比較的マイナーなコマンドのような気がするのと、今回の件については、現状の挙動に依存しているコードより、挙動の解釈のズレによる潜在的な問題を抱えているコードの方が多そうな気がするのと、説明に囲み記号とあるおかげで修正の根拠をある程度持たせることができると思うので、仕様の詳細化による回避より、コマンドの目的と挙動の定義を明確にした上で、変更してしまって良いんじゃないかなと思うのですが。

どこまで慎重にするべきかは、なかなか難しいところだと思いますが…

(#654) Re: 囲みトリムが囲み記号以外の文字も消去してしまう - しらたま (2009-04-25 18:01) /中 調査中
どういう実装が望ましいか、意見が欲しいので上げます。

(#2311) Re: 囲みトリムが囲み記号以外の文字も消去してしまう - のなお (2014-06-16 16:57) /中 調査中
質問掲示板から来ました。(http://nade.jp-pro.net/bbs/bbs/cbbs.cgi?mode=all&number=6720&type=0&space=0&no=0)

私は #124 のしらたまさんの「囲みトリム開始文字」と「囲みトリム開始文字」を持たせる案が望ましいと思いました。
変数は1つにして、開始と終了の2文字を代入するのもアリかとも思います。

例:囲み文字は「"」←同じ文字の場合は1文字でも可能にする
例:囲み文字は「'」←同じ文字の場合は1文字でも可能にする
例:囲み文字は「()」←開始と終了が違う場合は2つ入れる
例:囲み文字は『「」』←開始と終了が違う場合は2つ入れる

この命令自体どのようなシチュエーションで使うことになるのか分かりませんが、
同じ文字又は一対文字で囲まれた中身をトリミングするという機能は、とても分かりやすいと思っています。
(ダブル)クオーテーション記号(その他引用符記号?)のみに絞るのは、非互換のため避けたいです。

最後に、囲みトリム関数の上書きサンプルを考えてみました。
####
囲み文字とは文字列=「"」
「2200000.2」の囲みトリムを表示
「"A"」の囲みトリムを表示
「'A"」の囲みトリムを表示

●囲みトリム(Sの|Sから|Sで|Sを)
  Aとは配列=囲み文字を文字列分解
  #-----------------------------------
  ※囲み文字の設定無しの場合
  もし、(2<(Aの要素数))||(囲み文字=空)ならば、Sのシステム:囲みトリムで戻る  #★ノーマルトリム
  #-----------------------------------
  もし、Aの要素数=1ならば、A[1]=A[0]
  比較文字列とは文字列=「^({A[0]})(.+)({A[1]})$」
  もし、Sが比較文字列に正規表現一致ならば、抽出文字列[1]で戻る  #★指定トリム
  Sで戻る  #★一致しないので、トリム無し
####

ご参考まで。


話は違いますが。このバグ&要望掲示板の文字は小さすぎるので読むのに大変苦労します。
私のモニタは21インチですが、計ってみると文字の実寸は2mm~3mmほどで字は潰れてしまっています。
一時期文字サイズが標準になったんですが、いつの間にかまた戻ってしまいました。残念です。

(#2312) Re: 囲みトリムが囲み記号 - うぇいく (2014-06-16 17:36) /中 調査中
一応、現在の実装の状態と案を書いておきます。

現在の実装は以下です。
 以下の条件で囲み文字として扱い、取り除く操作を行う。
 ・文字列の先頭と最後に同じ文字がある場合。
 ・全角で、先頭と最後が「」『』【】{}()〔〕“”‘’<>の場合。
 ・半角で、先頭と最後が()[]{}`'<>の場合

今問題になっているのは、最初の同じ文字の条件のケースですが、他の文字についても、必ずしもの糂汰動きと一致するとは限りません。
(<>とか微妙な気が)

そこで、以下の2つのシステム変数を設けてこれにより制御する方法はどうでしょうか。

・囲みトリム文字単独というシステム変数を設ける。
 この変数にある文字が、文字列の最初と最後にある場合、囲み文字として取り除く。
 全角半角大文字小文字はすべて区別する。
 この変数が空欄の場合、1つの文字が開始と終了に現れたことによる囲み文字の処理は行わない。
 この変数に「全て」と指定した場合、開始と終了が一致していればどんな文字でも囲み文字として取り除く。
 ※「全」と「て」を囲み文字としたい場合、「て全」と指定することは可能。
 「なし」「無し」も特殊扱いしたほうがわかりやすいかも。
・囲みトリム文字ペアというシステム変数を設ける。
 この変数にある文字のペアが、文字列の最初と最後のある場合、囲み文字として取り除く。
 全角半角大文字小文字はすべて区別する。
 この変数が空欄の場合、ペア文字による囲み文字の処理は行わない。

無難なデフォルト値として、
囲みトリム文字単独=『"'`”’‘』
囲みトリム文字ペア=`「」『』【】{}()〔〕“”‘’<>` & 『()[]{}`'<>』
あたりを提案します。
(もしかすると、<><>は無い方が良いかも。)
変数のデフォルト値の扱いとしては、今後の更新で(より良くするために)変更する可能性がある旨を記載して、その影響を避けたい場合には、必ず明示的に代入して使うことを推奨しておくとよいかと思います。
(上記の<>とか後から削除するかもしれません。)

(#2314) 実装が難しそうなので。 - choco (2014-07-07 12:38) /中 調査中
まずは現在のなでしこの命令解説を適切な文章にする所から始めては如何でしょうか?
あれを見ると誤解を招くと思いますので・・・。

その上で、なでしこ2に実装するのか、なでしこ1に実装するのかを検討して頂けないでしょうか?

以上、よろしくお願いします。

(#122)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能