文字列の中から特定の文字列の数を調べるには?どうしたらいいですか?
それと特定の文字列の文字位置を全部手っ取り早く
取得するにはinstrを使ってどのようにコーディングしたら
いいのでしょうか?教えてくださいませ。
たとえば、『かたたたき』から「たた」を検索するような場合に、
これを 1個 とみなすのか、2個 とみなすのかにもよりますが、たとえば
案1) 空文字列にReplaceしてみて、変換前後の文字列の長さから判定。
案2) 正規表現クラスで判定(VB6ならVBScript.RegExp、VB.NETならRegex)
案3) 検索文字列でSplitしてみて、変換後の配列の個数から判定。
案4) InStr関数を繰り返し使って数える。
などといった手法が考えられます。(他にも方法はあるでしょうけれども)
> 取得するにはinstrを使ってどのようにコーディングしたらいいのでしょうか?
InStrを使ったコードを書いてみたけれど、意図したように動かなかった、という事でしょうか?
それとも、どのように処理していくべきなのか、そもそもの考え方(処理の手順)が思いつかない状態でしょうか?
あるいは、処理手順はイメージできたけれども、InStr関数の使い方が、ヘルプを見ても、あまり理解できなかった……という事でしょうか?
優しき、魔界の仮面弁士さんご回答ありがとうございます。
分かりずらかった表記、心からお詫び申し上げます。
>案4)InStr関数を繰り返し使って数える。
下とかぶっちゃいますけど、instrの方がなれているので
これの具体的な方法をお教えください。
>あるいは、処理手順はイメージできたけれども、InStr関数の使い方が、ヘ
>ルプを見ても、あまり理解できなかった……という事でしょうか?
InStrの文字位置を検索する方法は分かります。
ですが、同じ文字が複数ある場合最初にinstrで見つかった文字位置を
記憶して次のスタート位置にしてといった繰り返し処理が
大変なので具体的にForやdo whileなどを使って処理するコード
が分からないのです。
Visual Basic Q&A掲示板-文字列から文字を検索
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080114.txt
> 同じ文字が複数ある場合最初にinstrで見つかった文字位置を
> 記憶して次のスタート位置にしてといった繰り返し処理が
> 大変なので
この程度で大変って。。。(;‾Д‾)
まぁ記憶をするのが大変ならば、記憶をしなけりゃいいじゃん〜
ということで、さんぷる〜
Dim strHoge As String '文字列
Dim strChar As String '文字
Dim IntCnt As Integer '汎用カウンタ
IntCnt = 0
Do While Not (Len(strHoge) = 0)
If InStr(strHoge, strChar) > 0 Then
IntCnt = IntCnt + 1
TenNo = Right(strHoge, Len(strHoge) - InStr(strHoge, strChar))
Else
strHoge = ""
End If
Loop
何も考えず書いたけれど、こんなイメージで
TenNo = Right(strHoge, Len(strHoge) - InStr(strHoge, strChar))
は
strHoge = Right(strHoge, Len(strHoge) - InStr(strHoge, strChar))
のまちがい
InStrっていうキーワードがわかってて質問する内容かなぁ?
つーか、ちょっと前にも同じ質問なかったっけ?
夏休みの課題かと思うほど
この手のスレは乱立してた
恐らく、提出期限が近いのだろうね
> 分かりずらかった表記
一番分かり難かったのは、「開発環境」が明示されていない事ですね。(^^;
VBScriptか、VB.NETか、旧VB/VBAかで、回答の方向性も変わってきますし。
それと、質問内容自体にも、少々曖昧な部分があって、たとえば、
> 特定の文字列の数を
> 特定の文字列の文字位置を
などと、見つかった『位置』を知りたいのか、『数』を知りたいのかも
質問文からは読み取り難かったです。
(題名から想像するに、知りたいのは「数」ですよね?)
> 具体的にForやdo whileなどを使って処理するコードが分からないのです。
そういう時は、まず、御自身がやろうとしている処理が、
「何を繰り返させようとしている処理なのか」を想像すると良いかも。
今回の場合、
「InStrの第1引数(検索開始位置)を変更させながら、検索を繰り返す」
という処理方法になるわけですよね。
となれば、ループ中で、その開始位置を、徐々に変化させれば良いわけで。
で、ループ処理として、For〜Nextを使うべきか、それとも、
Do〜Loopを使うべきかという話がありますが、これは、ループ回数が
予め分かっている場合はFor、不明ならばDo、というのが一般的です。
例えば
"肩をたたいて、かたたたき"
から
"たた"
を探すような場合に、これを「2回」とみなしたい場合には、
[ループ回数]=[元の文字列の長さ]となりますので、Forが便利ですが、
これを「1回」としてカウントしたいのであれば、ループ回数が
事前には分かりにくいので、Do〜Loopの方が便利でしょうね。
》いなさん
> Dim strHoge As String '文字列
> Dim strChar As String '文字
元の質問文は、「特定の文字の数」ではなく、「特定の文字列の数」だったような。
> If InStr(strHoge, strChar) > 0 Then
> IntCnt = IntCnt + 1
> strHoge = Right(strHoge, Len(strHoge) - InStr(strHoge, strChar))
> Else
Right と Len を組み合わせて使うかわりに、Midを用いて、
strHoge = Mid(strHoge, InStr(strHoge, strChar) + 1)
のように書く事もできますね。この場合、先の例で言えば、
strHoge = "肩をたたいて、かたたたき"
strChar = "たた"
の時に、IntCnt が「3」という結果を返すようになります。
もしもこれを、「2」というカウントの仕方にしたいのであれば、
strHoge = Mid(strHoge, InStr(strHoge, strChar) + Len(strChar))
と書き換えればOKかな。
上のコード実際に打ってみましたがピクリトモ動きませんでしたよ。
どうしましょ?
>「特定の文字列の数」だったような。
そうです特定の文字列の数です。
具体的には"南に行きたいけどどうやって南にいけばいいか南ちゃんに
訊いてみましたが南を向いて答えてくれませんでした。"の
文字列の"南"の文字列数を知りたいのです。
この場合"南"の文字列数は4つです。
いなさんのコードは、変数strHogeとstrCharの設定部分を
省略してますが、その部分は記述してますか?
上の具体例では
strHoge = "南に行きたいけどどうやって南にいけばいいか南ちゃんに" & _
"訊いてみましたが南を向いて答えてくれませんでした。"
strChar = "南"
ですね。
> Dim strHoge As String '文字列
> Dim strChar As String '文字
元の質問文は、「特定の文字の数」ではなく、「特定の文字列の数」だったような。
仮面弁士さん、どもご指摘ありがとうございます。
正直な話、イメージさえ湧いてもらえればとおもって適当に書いています。
見つかった場所を覚えてループするのが嫌ならば、
見つかったところまでを、取り除いた文字列を元に、比較しましょ
という、意味合い(アルゴリズム)さえ通じればよいと思ってましたので、
当然、そのままで動くはずもありません。
>いなさん
動くようにしたいのですが?どうしましょ?
動くようにしたい。
じゃ無くって、↑の考え方だけではムリポ?
プログラミングって、結構モチベーションに依存することあるから、
ちゃんと動くように作るのは、骨というか、面倒なのね。
まぁ、共通関数的にもって置けるから、作っておこうかな〜とも考えてるけど。
出来たら、UPするけど、期待しないで。
o(゜Д゜)ノ<がんばってくださ〜い〜
はやり、対して面白くなかったわ
Public Function fGetCStrig(String1 As Atring,String2 As String) As Long
Dim strData As String
Dim lngLength As Long
fGetCStrig=0
strData = String1
lngLength=Len(String2)
Do Until (Len(strData)=0)
If InStr(strData , String2) > 0 Then
fGetCStrig = fGetCStrig + 1
strData = Right(strData , Len(strData ) - (InStr(strData , String2)+lngLength)+1)
Else
strData = ""
End If
Loop
End Function
...ほとんど変化なし…。
別のPCで動かした後、手打ちなので、間違ってるかも
Atring がエラー表示がでますが、ここは何を書き換えれば?
まだ、試してみる前段階です!
String
String2
>>
というのは検索文字列でいいんですよね?
あ、感謝の言葉をいうのを忘れていました。
ありがとうございます!!!
そそ、イメージ的には
Instrの時と同じように、第一引数に、対象の文字列、
第二引数に、検索する文字列です。
逆でした、忘れてください
おおお!いなさん!
夜分ありがとうございます!
o(・∇・o)(o・∇・)o !
見事に文字列の数を調べることができるファンクションがここに
誕生しました♪
mさんもどなたかしりませんが
教えてくださってありがとうございます!
♪v(‾(││)‾)v♪
これにて解決の終止符を打たせてもらいます。
本当にありがとうございました!
♪ヽ(´▽`)/ (●^o^●)\( ── ∇ ── )/ ♪♪ ♪
ま、徹夜みたいだし、恩赦ということで…。
その程度のデータ量なら、InStr以外の方法を使った方が手軽だと思う。。。
> 魔界の仮面弁士 2005/09/12(月) 19:17:28
> 案1) 空文字列にReplaceしてみて、変換前後の文字列の長さから判定。
a = (Len(strHoge) - Len(Replace(strHoge, strChar, ""))) \ Len(strChar)
> 案3) 検索文字列でSplitしてみて、変換後の配列の個数から判定。
a = UBound(Split(strHoge, strChar))
どちらもループする必要は無し。(細かい話を除けば、処理は一行で済む)
おおお!Dentalさん、たった一行で!
そんな方法もあるんですね!
o(・∇・o)(o・∇・)o !
>そんな方法もあるんですね!
いや、これって今はじめて提示された方法ではなく、最初から
>>>魔界の仮面弁士 2005/09/12(月) 19:17:28
で提示されていた方法なんですけどね。
どうやらInStr法にこだわりが在るようだったので、途中で口出しするのも
おこがましいかと思って、解決するのを待ってから投稿したという次第。
>>>instrの方がなれているので
>>>これの具体的な方法をお教えください。
ツイート | ![]() |