HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1114
ジュン文字列のアルファベットと数字を効率良く分解したい5未解決


ジュン

リンク

2018/11/14(Wed) 20:36:32|NO.85824

"a100b50C-30D40" という文字列を分解して配列に入れて、

a = 100
b = 50
C = -30
D = 40
と表示したいのですが、自分で作ると下記のような物凄く長ったらしいプログラムになってしまいます
もうちょっとやれる命令や関数や手法などありましたら教えてもらえないでしょうか

////////////////////////////////////////////////////////////////////////
a="a100b50C-30D40"

a=a+"Z"
a_len = strlen(a)

dim moji,a_len

dim check,a_len

repeat a_len
moji(cnt) = peek(a,cnt)
if (moji(cnt)>=65 & moji(cnt)<=90) | (moji(cnt)>=97 & moji(cnt)<=122){
a_count + = 1
check(cnt) = 1
}
loop

sdim alpha,,a_count
sdim number,,a_count

repeat a_len
if check(cnt) = 1{

alpha(s) = strmid(a,cnt,1)
if s!=0{
number(s-1) = strmid(a,p1+1,cnt-p1-1)
}
p1 = cnt
s+=1
}
loop


b=""
repeat a_count-1
b = b + alpha(cnt) + " = " + number(cnt) + "\n"
loop

mes b



この記事に返信する


さか

リンク

2018/11/14(Wed) 23:05:47|NO.85825

こんな感じでどうでしょう。
アルファベットを取得した後、カンマに置き換えて
splitでnumberに入れます。


a="a100b50C-30D40" alphaCnt = 0 repeat strlen( a ) if peek( a, cnt ) >= 'A' and peek( a, cnt ) <= 'z'{ alpha( alphaCnt ) = strf( "%c", peek( a, cnt ) ) alphaCnt ++ poke a, cnt, ',' } loop split a, ",", number b="" repeat alphaCnt b = b + alpha(cnt) + " = " + number(cnt+1) + "\n" loop mes b



cheperuphy

リンク

2018/11/14(Wed) 23:26:49|NO.85826

私が書いたらこんな感じです

ループがひとつですが、
さかさんの方がスマートで見やすいですね


a="a100b50C-30D40" a_count = 0 p1 = 0 a_small = "" dim moji,strlen(a) sdim alpha sdim number repeat strlen(a)+1 a_small = getpath(a,16) moji(cnt)=peek(a_small,cnt) if (moji(cnt)>=97 & moji(cnt)<=122) | (cnt=strlen(a)){ if a_count!=0{ alpha(a_count)=strmid(a,p1,1) number(a_count)=strmid(a,p1+1,cnt-p1-1) mes alpha(a_count) + " = " + number(a_count) } p1=cnt a_count+=1 } loop
ただ、できるなら元の文字列を
a = "a100:b50:C-30:D40"
のように特定の文字で区切って格納した方がいいと思います。
私はこうやって変数の配列をひとつずつ拡張していくのは好きではないですし、
その方が簡潔に書けますので。

どのような使い方をされるか書かれていないのでできるかわからないですが



あり

リンク

2018/11/15(Thu) 10:47:46|NO.85827

もう少しスマートに書けそうな気がしますが
正規表現を使うとこんな感じでしょうか。

#include "mod_regexp.as" data = "a100b50C-30D40" sdim alpha sdim number matches a,data,"([a-zA-Z]+)|((-\\d+)|(\\d+))" repeat length(a)/2 alpha(cnt)=a(cnt*2) number(cnt)=a(cnt*2+1) mes alpha(cnt)+" = "+number(cnt) loop



f(昼飯前)

リンク

2018/11/15(Thu) 10:56:55|NO.85828

そのアルファベットは大文字小文字を区別するのか、とか
そのアルファベットは絶対に一文字なのか、とか
そのアルファベットは絶対にAから抜けが無く昇順なのか、とか

全く説明されない部分が色々気になる。



ジュン

リンク

2018/11/15(Thu) 18:12:12|NO.85830

色んな方法あるんですね、参考になります!

>>f(昼飯前)さん

そうですね、すみません
大文字小文字区別します、複数文字あります、順番はめちゃくちゃです
"A50a50Abc50aBCd50" といったデータもあり得ます



ONION software Copyright 1997-2023(c) All rights reserved.