C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: split関数について


(過去ログ 42 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■22537 / inTopicNo.1)  split関数について
  
□投稿者/ asa (1回)-(2008/07/25(Fri) 14:42:35)

分類:[.NET 全般] 

VB.NET2005を使っています。超初心者です。
テキストボックスにメールアドレスを入れてそのアドレスに@マークが2つ以上入っていたらエラーメッセージを出す
ということがしたいのですが、そこでsplit関数を使ってやろうと思ってます。
自分なりに調べたり考えてやっているのですがうまくいきません。
どなたかご教授お願いします。
以下自分で書いたコードです。
よろしくお願いします。

Dim Spt() As String
Dim S As String
Dim i As Integer
S = txtMAddress.Text
Spt = Split(S, "@")
For i = 0 To S.Length - 1
If Spt(i) <> Spt(1) Then
Throw New Exception(cClass.MSG)
End If
Next
引用返信 編集キー/
■22538 / inTopicNo.2)  Re[1]: split関数について
□投稿者/ επιστημη (1182回)-(2008/07/25(Fri) 14:46:26)
επιστημη さんの Web サイト
> 自分なりに調べたり考えてやっているのですがうまくいきません。

"うまくいきません"を説明してください。

引用返信 編集キー/
■22539 / inTopicNo.3)  Re[2]: split関数について
□投稿者/ asa (2回)-(2008/07/25(Fri) 14:55:08)
No22538 (επιστημη さん) に返信
>>自分なりに調べたり考えてやっているのですがうまくいきません。
>
> "うまくいきません"を説明してください。
>

すみません。@をいくつ入れても自分で作ったcClass.MSGのエラーメッセージが出てしまうのです。
@マーク一個以外のときにエラーメッセージを出したいのですが.....
考え方が間違っているのでしょうか?
引用返信 編集キー/
■22540 / inTopicNo.4)  Re[1]: split関数について
□投稿者/ シャノン (552回)-(2008/07/25(Fri) 15:02:02)
No22537 (asa さん) に返信
> Dim Spt() As String
> Dim S As String
> Dim i As Integer
> S = txtMAddress.Text
> Spt = Split(S, "@")
> For i = 0 To S.Length - 1
> If Spt(i) <> Spt(1) Then
> Throw New Exception(cClass.MSG)
> End If
> Next

このコードでは、仮に @ が1個だけであったとしても、その前後の文字列が違うと Throw してしまいませんか。
あとは、@ が1個も含まれなかったら Spt(1) で例外が出ますね。
引用返信 編集キー/
■22541 / inTopicNo.5)  Re[3]: split関数について
□投稿者/ επιστημη (1183回)-(2008/07/25(Fri) 15:04:32)
επιστημη さんの Web サイト
2008/07/25(Fri) 15:17:25 編集(投稿者)
> すみません。@をいくつ入れても自分で作ったcClass.MSGのエラーメッセージが出てしまうのです。
> @マーク一個以外のときにエラーメッセージを出したいのですが.....

@がひとつであれば、Split("@")によって二つの部分に分かれるのだから、

If txtMAddress.Text.Split("@").Length <> 2 Then
  ' @が一個ぢゃない!
EndIf

ではダメですか?
# ただしこの場合 "@hoge" や "hoge@" でも'合格'となります。
# それらを'不合格'としたいならさらにチェックが必要でしょう。


引用返信 編集キー/
■22542 / inTopicNo.6)  Re[2]: split関数について
□投稿者/ asa (3回)-(2008/07/25(Fri) 15:14:32)
No22540 (シャノン さん) に返信
> ■No22537 (asa さん) に返信
>> Dim Spt() As String
>> Dim S As String
>> Dim i As Integer
>> S = txtMAddress.Text
>> Spt = Split(S, "@")
>> For i = 0 To S.Length - 1
>> If Spt(i) <> Spt(1) Then
>> Throw New Exception(cClass.MSG)
>> End If
>> Next
>
> このコードでは、仮に @ が1個だけであったとしても、その前後の文字列が違うと Throw してしまいませんか。
> あとは、@ が1個も含まれなかったら Spt(1) で例外が出ますね

Thowを通ってしまいます...
@が入ってない場合は他のコードでチェックしてエラーメッセージを出すようにしています。
引用返信 編集キー/
■22544 / inTopicNo.7)  Re[4]: split関数について
□投稿者/ asa (4回)-(2008/07/25(Fri) 15:21:36)
No22541 (επιστημη さん) に返信
>>すみません。@をいくつ入れても自分で作ったcClass.MSGのエラーメッセージが出てしまうのです。
>>@マーク一個以外のときにエラーメッセージを出したいのですが.....
>
> @がひとつであれば、Split("@")によって二つの部分に分かれるのだから、
>
> If txtMAddress.Text.Split("@") <> 2 Then
> ' @が一個ぢゃない!
> EndIf
>
> ではダメですか?
> # ただしこの場合 "@hoge" や "hoge@" でも'合格'となります。
> # それらを'不合格'としたいならさらにチェックが必要でしょう。
>
>

επιστημη さんのご指摘のとおりやってみたのですが次のエラーが出てしまいました。

演算子'<>'は型'string'の一次元配列および'integer'に対して定義されていません

というエラー内容です...。"@hoge" や "hoge@" でも合格という機能でやりたいのですが
私の説明不足でしたら申し訳ありません。


引用返信 編集キー/
■22546 / inTopicNo.8)  Re[5]: split関数について
□投稿者/ επιστημη (1184回)-(2008/07/25(Fri) 15:23:46)
επιστημη さんの Web サイト
ごめん。

× If txtMAddress.Text.Split("@") <> 2 Then
○ If txtMAddress.Text.Split("@").Length <> 2 Then

引用返信 編集キー/
■22547 / inTopicNo.9)  Re[4]: split関数について
□投稿者/ 魔界の仮面弁士 (793回)-(2008/07/25(Fri) 15:31:25)
2008/07/25(Fri) 15:33:01 編集(投稿者)

No22541 (επιστημη さん) に返信
>>@マーク一個以外のときにエラーメッセージを出したいのですが.....
空の文字列の場合も駄目なのですね。

> If txtMAddress.Text.Split("@") <> 2 Then
分割数を数えるなら、Split の後には、
Length とか UBound とか GetUpperBound とかを使う必要があるかと。

# …って書いたら、既に訂正が入ってた。(汗)


別解としては:

 Dim p As New System.Text.RegularExpressions.Regex("^[^@]*@[^@]*$")
 If p.IsMatch(s) Then
  Console.WriteLine("OK")
 Else
  Console.WriteLine("Error")
 End If

とか

 If s Like "*@*" AndAlso s.LastIndexOf("@") = s.IndexOf("@") Then
  Console.WriteLine("OK")
 Else
  Console.WriteLine("Error")
 End If

とか、

 If s Like "*@*@*" OrElse Not s Like "*@*" Then
  Console.WriteLine("Error")
 Else
  Console.WriteLine("OK")
 End If

とか。
引用返信 編集キー/
■22548 / inTopicNo.10)  Re[6]: split関数について
□投稿者/ asa (5回)-(2008/07/25(Fri) 15:31:51)
No22546 (επιστημη さん) に返信
> ごめん。
>
> × If txtMAddress.Text.Split("@") <> 2 Then
> ○ If txtMAddress.Text.Split("@").Length <> 2 Then
>

επιστημη さん!
できました!ありがとうございます!
迅速な対応をしてもらい感謝感謝です!
私的に配列に問題があると思っていたので...

こんなやり方があるなんて...勉強不足ですのでもっと頑張ります。
ありがとうございました(T_T)
引用返信 編集キー/
■22549 / inTopicNo.11)  Re[3]: split関数について
□投稿者/ まどか (563回)-(2008/07/25(Fri) 15:36:22)
SplitであれString.Splitであれ、結果の文字列配列がどのような構成になるのかを理解しましょう。
http://msdn.microsoft.com/ja-jp/library/6x627e5f.aspx

シャノンさんも書かれていますが、spt(1)とインデックスを指定して書くということは
そのインデックス要素があるという前提のコードになります。

MSDNにも書かれていますが、両端に区切り文字がある場合は両端に空文字("")があるという前提で動作します。
つまり、区切り文字は元文字列の内側にあるという前提が成り立ちます。
これは何を意味するかというと、元の文字列は
文字列+区切り文字列+文字列+区切り文字列+・・・・・+区切り文字列+文字列
という構成であるということを意味します。
つまり、結果の要素数=区切り文字の出現回数+1、が成り立ちます。

区切り文字の出現を1度のみ許可するということであれば、「結果の要素数は2であるはずだ」ということです。

「spt(1)という無いかもしれない要素を参照すること」と「要素の数を検証すること」を比較して考えてみてください。
引用返信 編集キー/
■22551 / inTopicNo.12)  Re[5]: split関数について
□投稿者/ asa (6回)-(2008/07/25(Fri) 15:40:27)
No22547 (魔界の仮面弁士 さん) に返信
> 2008/07/25(Fri) 15:33:01 編集(投稿者)
>
> ■No22541 (επιστημη さん) に返信
> >>@マーク一個以外のときにエラーメッセージを出したいのですが.....
> 空の文字列の場合も駄目なのですね。
>
>>If txtMAddress.Text.Split("@") <> 2 Then
> 分割数を数えるなら、Split の後には、
> Length とか UBound とか GetUpperBound とかを使う必要があるかと。
>
> # …って書いたら、既に訂正が入ってた。(汗)
>
>
> 別解としては:
>
>  Dim p As New System.Text.RegularExpressions.Regex("^[^@]*@[^@]*$")
>  If p.IsMatch(s) Then
>   Console.WriteLine("OK")
>  Else
>   Console.WriteLine("Error")
>  End If
>
> とか
>
>  If s Like "*@*" AndAlso s.LastIndexOf("@") = s.IndexOf("@") Then
>   Console.WriteLine("OK")
>  Else
>   Console.WriteLine("Error")
>  End If
>
> とか、
>
>  If s Like "*@*@*" OrElse Not s Like "*@*" Then
>   Console.WriteLine("Error")
>  Else
>   Console.WriteLine("OK")
>  End If
>
> とか。


なるほど!正規表現を使って@を1個に限定させるとは...
思いつかなかったです。
いろんなやり方があるのですね!
皆さんから教えてもらった技術をもう一度自分なりに勉強してみます!

ほんとうに皆さんありがとうございます!
またどうしてもわからなくなったら質問させていただきます!
そのときはよろしくお願いします!
引用返信 編集キー/
■22552 / inTopicNo.13)  Re[6]: split関数について
□投稿者/ シャノン (553回)-(2008/07/25(Fri) 15:43:46)
No22551 (asa さん) に返信
> なるほど!正規表現を使って@を1個に限定させるとは...

これは正規表現じゃなくてワイルドカードです。
ちなみにメールアドレスの厳密な規則はかなり複雑です。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9
引用返信 編集キー/
■22553 / inTopicNo.14)  Re[4]: split関数について
□投稿者/ asa (7回)-(2008/07/25(Fri) 15:49:27)
No22549 (まどか さん) に返信

なるほど..
私はまだまだ理解していないようです。
今回の件でご指摘下さった部分は理解できるように勉強させていただきます!
引用返信 編集キー/
■22555 / inTopicNo.15)  Re[7]: split関数について
□投稿者/ asa (8回)-(2008/07/25(Fri) 16:23:30)
No22552 (シャノン さん) に返信
>
> http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

↑見させてもらいました!返信遅れてすみません。
ローカル部に使用できる文字、ドメインに使用できる文字など最初に書いているところだけでも知らないことばかりでした..
もっと勉強していきます。
ありがとうございます!

引用返信 編集キー/
■22556 / inTopicNo.16)  Re[5]: split関数について
□投稿者/ asa (9回)-(2008/07/25(Fri) 16:24:05)
No22553 (asa さん) に返信
> ■No22549 (まどか さん) に返信
>
> なるほど..
> 私はまだまだ理解していないようです。
> 今回の件でご指摘下さった部分は理解できるように勉強させていただきます!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -