■記事リスト / ▲上のスレッド
■13790 / 親記事) |
文字列から記号のみ取り出ししたい
|
□投稿者/ いぶけん -(2023/05/28(Sun) 07:00:20)
| 2023/05/28(Sun) 07:18:29 編集(投稿者) 2023/05/28(Sun) 07:05:35 編集(投稿者)
"/123abc*#" のような文字列があったとします 記号位置と記号文字数はランダムです
ここから項目計算式で、英数字を除いた"/*#"のみを取り出したいのですが スマートな方法が分からずアドバイスを頂きたいです。
桐10sです
追記: 英数字も記号同様ランダムです。
|
|
|
▽[全レス7件(ResNo.3-7 表示)]
■13793 / ResNo.3) |
Re[2]: 文字列から記号のみ取り出ししたい
|
□投稿者/ いぶけん -(2023/05/28(Sun) 14:25:46)
| > このリクエストは[記号文字だけを残す]という意味なのですか?
そうです。書き漏らしましたが、 記号も /*# だけではなく、?$など全ての記号を #部分列 みたいな感じで取り出せないか?ということです。
先にも書きましたが、その項目の英数字を含む文字数もランダムであり、 記号の文字数もランダム、記号の文字位置もランダムです。
|
|
|
■13796 / ResNo.4) |
Re[3]: 文字列から記号のみ取り出ししたい
|
□投稿者/ ONnoji -(2023/05/28(Sun) 17:55:41)
| 2023/05/29(Mon) 12:00:01 編集(投稿者) 2023/05/29(Mon) 10:23:12 編集(投稿者) 2023/05/29(Mon) 00:31:20 編集(投稿者)
> 記号も /*# だけではなく、?$など全ての記号を #部分列 みたいな感じで取り出せないか?ということです。
記号文字が含まれているか否かは #is記号という関数で調べられます。
なお、この関数は最初に見つかった記号文字が何番目に位置しているという情報を返します。
しかし、複数個の記号文字が含まれている可能性がありますから、計算式一発!というわけにはいかないですね。
この場合には、文字列の先頭から末尾まで一文字ずつシフトして調べていく方法がシンプルです。※シンプル・イズ・ベスト
対象になる文字列の文字数がどんなに多くても、あっという間に実行完了してしまいますので、パフォーマンスを心配する必要はありませんよ。
ということで、こういうのは関数では出来ないですよ。
[フォーム+イベント処理]のサンプルを添付しますので参考にしてください。
なお、添付ファイルは数日を目途に削除しますので、ダウンロードはお早めに願います。
<参考>
■フォームの編集対象表の表定義
項目番号 項目名 データ型 項目計算式 挿入初期値式 1 文字列 文字列 2 記号文字抽出結果 文字列
■フォームのコマンドボタン
オブジェクト名: cmd記号文字を抽出 標題 : 記号文字を抽出
機能名 機能パラメータリスト 1 表示 2 手続き実行 cmd記号文字を抽出Click 3 なし 4 なし
■イベントン処理の定義
名札 メイン
*
手続き定義開始 cmd記号文字を抽出Click( ) 変数宣言 自動,文字列{ &抽出文字列 } 変数宣言 自動,整数 { &multiTblNum }
多重化 &multiTblNum = #is表
ジャンプ 行番号 = 先頭 ┌繰り返し ( .not #eof ) │ │┌if ( #is記号( [文字列], 0 ) ) /* if ( #is記号( [文字列], 0 ) <> 0 ) でも同じ */ ││ ││ 手続き実行 prc記号文字を抽出( [文字列], &抽出文字列 ) ││ 行訂正 [記号文字抽出結果] = &抽出文字列 │└end │ │ ジャンプ 行番号 = 次行 └繰り返し終了
終了 表 &multiTblNum
手続き定義終了
手続き定義開始 prc記号文字を抽出( 文字列 &string, 参照 文字列 &result ) 変数宣言 自動,文字列{ &chr } 変数宣言 自動,整数 { &length } 変数宣言 自動,整数 { &i, &loop, &step = 1 }
&result = #u &length = #文字数( &string ) &loop = &length ┌繰り返し &i = 1, &loop, &step │ │ &chr = #sstr( &string, &i, 1 ) │┌if ( #is記号( &chr, 0 ) ) ││ ││ &result = &result + &chr │└end │ └繰り返し終了
トレース出力 _&string トレース出力 _&result
手続き定義終了
|
|
|
■13798 / ResNo.5) |
Re[2]: 文字列から記号のみ取り出ししたい
|
□投稿者/ まさやん -(2023/05/28(Sun) 19:02:50)
| 2023/05/28(Sun) 19:17:31 編集(投稿者) 2023/05/28(Sun) 19:14:08 編集(投稿者) 2023/05/28(Sun) 19:13:13 編集(投稿者)
先ほどの式では
重複した 記号が 1つしか抽出してくれませんでした なので
&比較式="//123abc*#%/%%",&STR="" 変数宣言 整数,{&文字位置}
繰り返し 条件 (#IS記号(&比較式,0)=0) 繰り返し中止 if(#IS記号(&比較式,0)>0) &文字位置=#IS記号(&比較式,0) &置換式=#部分列(&比較式,#IS記号(&比較式,0),1) &STR=&STR+&置換式 &比較式=#部分列(&比較式,&文字位置+1) end 繰り返し終了 変数書き出し "記号",{&STR},終了状態=&秒
に変更します
結果が //*#%/%% になりました 追伸 if end が要らないかもです。
|
|
|
■13799 / ResNo.6) |
Re[1]: 文字列から記号のみ取り出ししたい
|
□投稿者/ いぶけん -(2023/05/28(Sun) 19:06:35)
| まさやんさん、ONnojiさん ありがとうございました。
ダウンロードしました。 自分の望み通りの動作です。 本当に助かりました!
|
解決済み! |
|
■13802 / ResNo.7) |
Re[4]: 文字列から記号のみ取り出ししたい
|
□投稿者/ ONnoji -(2023/05/29(Mon) 14:26:06)
| 2023/06/01(Thu) 11:18:21 編集(投稿者)
ホントの蛇足
アプローチとしては次の2通り考えられますね。
・文字列の先頭から末尾まで一文字ずつシフトして調べていく方法 ・作業文字列の記号文字の位置を調べていく方法
ご参考まで。(^^ゞ
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
■文字列の先頭から末尾まで一文字ずつシフトして調べていく方法
手続き定義開始 prc記号文字を抽出( 文字列 &string, 参照 文字列 &result ) 変数宣言 自動,文字列{ &chr } 変数宣言 自動,整数 { &length } 変数宣言 自動,整数 { &i, &loop, &step = 1 }
&result = #u &length = #文字数( &string ) &loop = &lengtht ┌繰り返し &i = 1, &loop, &step │ │ &chr = #sstr( &string, &i, 1 ) │┌if ( #is記号( &chr, 0 ) ) ││ ││ &result = &result + &chr │└end │ └繰り返し終了
トレース出力 _&string トレース出力 _&result
手続き定義終了
■作業文字列の記号文字の位置を調べていく方法
手続き定義開始 prc記号文字を抽出2( 文字列 &string, 参照 文字列 &result ) 変数宣言 自動,文字列{ &workString, &chr } 変数宣言 自動,整数 { &at }
&workString = &string &result = #u ┌繰り返し ( #is記号( &workString, 0 ) ) │ │ &at = #is記号( &workString, 0 ) │ &chr = #sstr( &workString, &at, 1 ) │ &result = &result + &chr │ │ &workString = #sstr( &workString, &at + 1 ) │ └繰り返し終了
トレース出力 _&string トレース出力 _&result
手続き定義終了
|
|
|
■記事リスト /
レス記事表示 →
[親記事-7]
|