文字列の中から特定の文字列の数を調べるには?

解決


GETOUT  2005-09-13 04:02:19  No: 125230

文字列の中から特定の文字列の数を調べるには?どうしたらいいですか?
それと特定の文字列の文字位置を全部手っ取り早く
取得するにはinstrを使ってどのようにコーディングしたら
いいのでしょうか?教えてくださいませ。


魔界の仮面弁士  2005-09-13 04:17:28  No: 125231

たとえば、『かたたたき』から「たた」を検索するような場合に、
これを 1個 とみなすのか、2個 とみなすのかにもよりますが、たとえば

案1) 空文字列にReplaceしてみて、変換前後の文字列の長さから判定。
案2) 正規表現クラスで判定(VB6ならVBScript.RegExp、VB.NETならRegex)
案3) 検索文字列でSplitしてみて、変換後の配列の個数から判定。
案4) InStr関数を繰り返し使って数える。

などといった手法が考えられます。(他にも方法はあるでしょうけれども)

> 取得するにはinstrを使ってどのようにコーディングしたらいいのでしょうか?
InStrを使ったコードを書いてみたけれど、意図したように動かなかった、という事でしょうか?
それとも、どのように処理していくべきなのか、そもそもの考え方(処理の手順)が思いつかない状態でしょうか?
あるいは、処理手順はイメージできたけれども、InStr関数の使い方が、ヘルプを見ても、あまり理解できなかった……という事でしょうか?


GETOUT  2005-09-13 05:28:12  No: 125232

優しき、魔界の仮面弁士さんご回答ありがとうございます。
分かりずらかった表記、心からお詫び申し上げます。

>案4)InStr関数を繰り返し使って数える。
下とかぶっちゃいますけど、instrの方がなれているので
これの具体的な方法をお教えください。

>あるいは、処理手順はイメージできたけれども、InStr関数の使い方が、ヘ
>ルプを見ても、あまり理解できなかった……という事でしょうか?

InStrの文字位置を検索する方法は分かります。
ですが、同じ文字が複数ある場合最初にinstrで見つかった文字位置を
記憶して次のスタート位置にしてといった繰り返し処理が
大変なので具体的にForやdo whileなどを使って処理するコード
が分からないのです。


Blue  2005-09-13 06:48:55  No: 125233

Visual Basic Q&A掲示板-文字列から文字を検索
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080114.txt

> 同じ文字が複数ある場合最初にinstrで見つかった文字位置を
> 記憶して次のスタート位置にしてといった繰り返し処理が
> 大変なので
この程度で大変って。。。(;‾Д‾)


いな  2005-09-13 07:02:37  No: 125234

まぁ記憶をするのが大変ならば、記憶をしなけりゃいいじゃん〜

ということで、さんぷる〜
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

何も考えず書いたけれど、こんなイメージで


いな  2005-09-13 07:03:36  No: 125235

TenNo = Right(strHoge, Len(strHoge) - InStr(strHoge, strChar))

strHoge = Right(strHoge, Len(strHoge) - InStr(strHoge, strChar))

のまちがい


通ってみた  2005-09-13 08:51:15  No: 125236

InStrっていうキーワードがわかってて質問する内容かなぁ?

つーか、ちょっと前にも同じ質問なかったっけ?


いな  2005-09-13 09:39:25  No: 125237

夏休みの課題かと思うほど
この手のスレは乱立してた

恐らく、提出期限が近いのだろうね


魔界の仮面弁士  2005-09-13 09:55:52  No: 125238

> 分かりずらかった表記
一番分かり難かったのは、「開発環境」が明示されていない事ですね。(^^;
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かな。


GETOUT  2005-09-13 12:27:45  No: 125239

上のコード実際に打ってみましたがピクリトモ動きませんでしたよ。
どうしましょ?

>「特定の文字列の数」だったような。
そうです特定の文字列の数です。
具体的には"南に行きたいけどどうやって南にいけばいいか南ちゃんに
訊いてみましたが南を向いて答えてくれませんでした。"の
文字列の"南"の文字列数を知りたいのです。
この場合"南"の文字列数は4つです。


LESIA  2005-09-13 12:45:54  No: 125240

いなさんのコードは、変数strHogeとstrCharの設定部分を
省略してますが、その部分は記述してますか?

上の具体例では
strHoge = "南に行きたいけどどうやって南にいけばいいか南ちゃんに" & _
          "訊いてみましたが南を向いて答えてくれませんでした。"
strChar = "南"
ですね。


いな  2005-09-13 12:47:40  No: 125241

> Dim strHoge As String '文字列
> Dim strChar As String '文字
元の質問文は、「特定の文字の数」ではなく、「特定の文字列の数」だったような。

仮面弁士さん、どもご指摘ありがとうございます。
正直な話、イメージさえ湧いてもらえればとおもって適当に書いています。

見つかった場所を覚えてループするのが嫌ならば、
見つかったところまでを、取り除いた文字列を元に、比較しましょ
という、意味合い(アルゴリズム)さえ通じればよいと思ってましたので、

当然、そのままで動くはずもありません。


GETOUT  2005-09-13 12:51:08  No: 125242

>いなさん 
動くようにしたいのですが?どうしましょ?


いな  2005-09-13 13:12:23  No: 125243

動くようにしたい。
じゃ無くって、↑の考え方だけではムリポ?

プログラミングって、結構モチベーションに依存することあるから、
ちゃんと動くように作るのは、骨というか、面倒なのね。
まぁ、共通関数的にもって置けるから、作っておこうかな〜とも考えてるけど。

出来たら、UPするけど、期待しないで。


GETOUT  2005-09-13 13:25:16  No: 125244

o(゜Д゜)ノ<がんばってくださ〜い〜


いな  2005-09-13 14:01:13  No: 125245

はやり、対して面白くなかったわ

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で動かした後、手打ちなので、間違ってるかも


GETOUT  2005-09-13 14:11:33  No: 125246

Atring がエラー表示がでますが、ここは何を書き換えれば?
まだ、試してみる前段階です!


  2005-09-13 14:18:14  No: 125247

String


GETOUT  2005-09-13 14:18:35  No: 125248

String2
>>
というのは検索文字列でいいんですよね?
あ、感謝の言葉をいうのを忘れていました。
ありがとうございます!!!


いな  2005-09-13 14:22:30  No: 125249

そそ、イメージ的には
Instrの時と同じように、第一引数に、対象の文字列、
第二引数に、検索する文字列です。


いな  2005-09-13 14:23:32  No: 125250

逆でした、忘れてください


GETOUT  2005-09-13 14:30:38  No: 125251

おおお!いなさん!
夜分ありがとうございます!
o(・∇・o)(o・∇・)o !
見事に文字列の数を調べることができるファンクションがここに
誕生しました♪
mさんもどなたかしりませんが
教えてくださってありがとうございます!
♪v(‾(││)‾)v♪ 
これにて解決の終止符を打たせてもらいます。
本当にありがとうございました!
♪ヽ(´▽`)/ (●^o^●)\( ── ∇ ──  )/ ♪♪ ♪


いな  2005-09-13 14:36:37  No: 125252

ま、徹夜みたいだし、恩赦ということで…。


Dental  2005-09-13 23:25:18  No: 125253

その程度のデータ量なら、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))

どちらもループする必要は無し。(細かい話を除けば、処理は一行で済む)


GETOUT  2005-09-14 00:49:04  No: 125254

おおお!Dentalさん、たった一行で!
そんな方法もあるんですね!
o(・∇・o)(o・∇・)o !


Dental  2005-09-14 01:41:11  No: 125255

>そんな方法もあるんですね!

いや、これって今はじめて提示された方法ではなく、最初から
>>>魔界の仮面弁士 2005/09/12(月) 19:17:28
で提示されていた方法なんですけどね。

どうやらInStr法にこだわりが在るようだったので、途中で口出しするのも
おこがましいかと思って、解決するのを待ってから投稿したという次第。

>>>instrの方がなれているので
>>>これの具体的な方法をお教えください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加