VBSでの配列の存在確認についての質問

このQ&Aのポイント
  • VBSで配列の存在確認をしたいと思っています。具体的には、ドメインを取得するプログラムを作成したいのですが、苦戦しています。
  • 現在、以下のVBSコードを使用しています。しかし、正しいURLが渡されない場合にプログラムが実行エラーになってしまいます。
  • この問題を解決するために、どのようにすれば良いでしょうか?存在確認を行う方法を教えてください。
回答を見る
  • ベストアンサー

vbs 配列の存在確認をしたい。

VBSで、ドメインを取るプログラムを作りたくて 悪戦苦闘しています。 Dim reg Dim Matches Dim testUrl Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "/{2}([^/]+)/" testUrl = "http://www.test.co.jp/test.html" ←ここは実際はメソッドの引数値が入ります Set Matches = reg.Execute(testUrl) msgbox Replace(Matches(0).Submatches(0),"www.","") 上記、きちんとしたurlが入ってくる場合はいいのですが、 そうとは限らず、testUrl = "http://www" というような半端な 値が入ってきた場合、落ちてしまいます。 Matches(またはSubmatches)のインデクサがないからだと思われますが、 存在確認をするにはどうしたら良いか、教えていただけないでしょうか。

  • ginfix
  • お礼率34% (330/962)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

質問にあるコードを前提にすると、 If Matches.Count = 0 Then   msgbox "実行不可形式なURL" Else   msgbox Replace(Matches(0).Submatches(0),"www.","") End If で済むと思います。 しかし、サブドメインがwwwでないものや、URLの最後が/で終わらないもの http://blog.test.co.jp/ http://test.co.jp/test.html http://www.test.co.jp といったものからドメインの抽出が行えません。 やりたいことにそういったものがなければ良いのですが。

ginfix
質問者

お礼

回答ありがとうございます。 仰る通り、wwwでないものについて考慮できていませんでしたね…。 ちょっと正規表現を見直してみます。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4844/10254)
回答No.1

マッチしたかどうかを判断したいのなら、Matchesコレクションの個数 つまり、Matches.count > 0 で判断できます。 ドメインの次の / が省略されている場合でもと言うことであれば、 reg.Pattern = "/{2}([^/]+)/?" ですね。

ginfix
質問者

お礼

回答ありがとうございます。 末尾省略は考慮できておりませんでしたので、大変助かりました。 ありがとうございます。

関連するQ&A

  • VBS、正規表現でドメインを取りたい。

    VBScriptで開発をしています。 文字列からドメインだけを取得したくて、ネットで調べて以下のような コードを書いてみましたが、うまくいきません。 正規表現がうまくマッチしてこないようなのですが、初心者故よくわからず…。 おかしい点、修正すべき点を教えていただけないでしょうか。 Dim reg Set reg = Server.CreateObject("VBScript.RegExp") reg.Pattern = "/^[httpsfile]+:\/{2,3}([0-9a-zA-Z\.\-:]+?):?[0-9]*?\//i" Dim testUrl testUrl = "http://www.test.co.jp/test.html" Set Matches = ObjRegExp.Execute(testUrl) Dim Matches Dim Match Dim StrTest For Each Match in Matches StrTest = Match.value Next

  • vbaで正規表現

    正規表現のコードなんですが、 上手く動きません。 何故でしょうか… Sub Test() Dim reg As Object Dim ans As Object Dim c As Range         Set reg = CreateObject("VBScript.RegExp")     For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))             With reg             .Pattern = "^【[(1)-(20)](\d*/\d*)"             Set ans = .Execute(c.Value)         End With                 If ans > 0 Then             If Len(ans(0).submatches(0)) > 0 Then                             Debug.Print c.Address & "|" & ans(0).submatches(0)                             End If         End If             Next     End Sub

  • VBSでのhtmlタグ要素名の置換

    ' VBSでのhtmlタグ要素名の置換 ' htmlファイルのタグ名を小文字に統一するスクリプトを作りたいと思っています。 ' で、以下のスクリプトを書きました。(問題は置換処理だけなので要点をシンプルに抜き出しました) ' 要素名をすべて記述するのではなく、「<[A-Z]+」等のように記述してヒットした結果を ' 小文字化するなどして置換をおこないたいと思っています。 ' (将来的には属性名も対応したいと思っています) ' ずばりそのものの記述・代替案等を希望しています。 ' よろしくお願いします。 ' ※可能ならコードonlyで会話しましょう。 Option Explicit Dim reg Set reg = New RegExp Function replace(bodyStr, beforeStr, afterStr) reg.Pattern = beforeStr reg.Global = True replace = reg.Replace(bodyStr, afterStr) End Function Dim fileText fileText = "<HTML>HTML</HTML>" ' 要素名の小文字化 ' fileText = replace(fileText, "<HTML+", "<html") ' fileText = replace(fileText, "</HTML", "</html") fileText = replace(fileText, "<[A-Z]+", LCase(RegExp.$1)) If fileText = "<html>HTML</html>" Then MsgBox "期待通り!" Else MsgBox "これじゃダメだよ…orz:" + fileText End If

  • VBS正規表現の方法

    教えてください。 <内容> VBSにてメールアドレスチェックをしているのですが、うまくいきません。 <仕様> アカウント 大文字不可。 ドメイン  大文字不可。 最後は英文字で終わる。 .(ドット)とかで終わりにしない。 <ソース> Set objRE = New RegExp objRE.Global = True objRE.IgnoreCase = False objRE.Pattern = "([0-9a-z_\.+-]*)(@?)([0-9a-z-\.]*)([a-z]+)" Set Matches = objRE.Execute(mstrMailValue) Set objSM = Matches(0) mAccount = objSM.SubMatches(0) mAtmark = objSM.SubMatches(1) mDomain = objSM.SubMatches(2) & objSM.SubMatches(3) MsgBox (mAccount & mAtmark & mDomain) If (mAtmark <> "@") Then MailChk = False Else If (Len(mAccount) < 1) Or (Len(mAccount) >= 80) Then MailChk = False Else If (Len(mDomain) <= 3) Or (Len(mDomain) >= 63) Then MailChk = False Else If (mAccount & mAtmark & mDomain) <> mstrMailValue Then MailChk = False Else MailChk = True End If End If End If End If objRE.Patternがうまくいっていないと思います。 全て数値にすると、エラー(VBSがストップ)する。 どなたか教えてくださいませ。m(-_-)m 上記のソースよりも他の手があれば教えてください。

  • VBA エクセル 文字列

    A列に、【鈴木 太郎】、【佐藤 一郎】・・・・と続いていて、B列には鈴木、佐藤・・・と表示させたい場合は以下のソースに、 =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) と同じソースを書けばいいのはわかるのですが、勉強不足でわかりません。教えていただけませんでしょうか。下記のソースも教えていただきました。すごく助かります。 Sub PickupWords() Dim Matches As Object Dim Match As Object Dim buf As String Dim c As Variant With CreateObject("VBScript.RegExp") .Pattern = "【(.+)】" .Global = False Application.ScreenUpdating = False For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp)) If .Test(c.Value) Then buf = c.Value Set Matches = .Execute(buf) c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す End If Next c Application.ScreenUpdating = True End With End Sub

  • wshで他の複数のwshを一度に起動したい

    WSHから他のWSH(例えばtest1.vbs、test2.vbs、test3.vbs)を順に起動していく処理だと、下記(プログラム1)の通りで上手く行くのですが、一度に並行してキックさせたい場合は、どのようにしたら良いでしょうか? ----------プログラム1(start)--------------- Const ForReading = 1 Dim FileShell Set FileShell = WScript.CreateObject("Scripting.FileSystemObject") Function ReadFile(ByVal FileName) ReadFile = FileShell.OpenTextFile(FileName, ForReading, False).ReadAll() End Function Execute ReadFile("test1.vbs") Execute ReadFile("test2.vbs") Execute ReadFile("test3.vbs") ----------プログラム1(end)---------------

  • VBS ADO接続について

    VBSCRIPTを使用するのが始めてでなかなかうまくいきません アドバイス頂けますでしょうか。 環境 Windows2000Server 下記のようにしてみたのですが、エラーメッセージとしては 「オブジェクト名'test2'は無効です。」と出てしまいます。 このテーブル'test2'はクエリアナライザでSQLを使って 作成しました。 色々調べてはいますが、できましたらアドバイスの方お願いできますでしょうか。 Private Function DbDataUpdate(id2) Dim sql Dim conObj_ 'DBオブジェクトの生成 Set conObj_ = WScript.CreateObject("ADODB.Connection") conObj_.open "DSN=×××;UID=×××;PWD=×××;" conObj_.BeginTrans sql = "INSERT INTO test (id1, id2) " & _ "SELECT id1, id2 FROM test2 " & _ "WHERE " & _ "del = 0 AND " & _ "id2 = '" & id2 & "'" conObj_.execute(sql) sql = "UPDATE test2 " & _ "SET del = 1," &_ "WHERE " & _ "del = 0 AND " & _ "id2 = '" & id2 & "'" conObj_.execute(sql) conObj_.CommitTrans conObj_.close End Function

  • EXCEL VBA 文字列 

    下記のソースの場合、一つのセル(例えばA1)に【鈴木 太郎】とあれば、隣のセル(B1)に"鈴木 太郎"と表示されます。 (これを一つのセルに【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合は、"鈴木 太郎】【佐藤 太郎】【伊藤 太郎"と表示されます。) 例えば、C1には【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合には、C2には"鈴木 太郎"、D2に"佐藤 太郎"、E2に"伊藤 太郎"とすることは可能でしょうか? ※行によって異なり、【○○ ○○】はいくつあるとは限らないとします。 よろしくお願いいたします。 Sub PickupWords()  Dim Matches As Object  Dim Match As Object  Dim buf As String  Dim c As Variant  With CreateObject("VBScript.RegExp")   .Pattern = "【(.+)】"   .Global = False   Application.ScreenUpdating = False   For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))    If .Test(c.Value) Then     buf = c.Value     Set Matches = .Execute(buf)    c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す    End If   Next c   Application.ScreenUpdating = True  End With End Sub

  • ExcelでRegExpのFunctionの作成

    エクセルVBAで、文字列と正規パターンを引数として渡すと、マッチした文字位置の羅列を","区切りの文字列で返すようなFunctionを作ろうと考えています。なかなかうまく作れなくて困っています。どなたか、詳しいかたいらっしゃいましたら教えて頂けないでしょうか?宜しくお願いいたします。 発生する実行時エラー 実行時エラー'5020': 'Execute'メソッドは失敗しました:'IRegExp2'オブジェクト 追伸:ネットで、自動作成してくれるサイトがありそのコードを参考にアレンジしました。つじつまが合わない部分は、私の改編によるものだと思います。 Function Get_Position_RegExp(MySource As String, MyPattern As String) As Variant Dim MyReg As RegExp Dim MyMatch As MatchCollection Dim i As Match Set MyReg = CreateObject("VBScript.RegExp") With MyReg .Pattern = MyPattern .Global = True Set MyMatch = .Execute(MySource) End With Get_Position_RegExp = "" For Each i In MyMatch Get_Position_RegExp = Get_Position_RegExp & "," & i.FirstIndex + 1 Next Set MyMatch = Nothing Set MyReg = Nothing End Function

  • ASPからVBS実行時の権限

    ASPからWscript.Shellを使ってVBSを実行しているのですが、 ASP中のDBオープンには問題はないのですが、test.vbs中でオープンできません LOGファイルは"dbConnection-OK"までになっています。 権限の問題かどうかはわからないのですが、原因は何でしょうか? DBはODBC経由のSQLServerです。 ---------ASP-------------------------------------- <% Dim dbConnection Set dbConnection = CreateObject("ADODB.Connection") dbConnection.Open "testdb" dbConnection.Close Set dbConnection = Nothing '上記OPENに関して問題なし Dim WshShell Set WshShell = CreateObject("Wscript.Shell") WshShell.Run "cscript.exe e:\test.vbs 123", 0, True Set WshShell = Nothing %> <html> <head> <meta http-equiv="Cache-Control" content="no-cache" /> <title>Pipot.to</title> </head> <body> OK </body> </html> ---------test.vbs-------------------------------------- Dim ObjFSO Dim ObjTS Set ObjFSO = CreateObject("Scripting.FileSystemObject") Set ObjTS = ObjFSO.CreateTextFile("e:\log.txt") ObjTS.Write "LOG開始" Dim dbConnection Set dbConnection = CreateObject("ADODB.Connection") ObjTS.Write "dbConnection-OK" dbConnection.Open "testdb" ObjTS.Write "OPEN-OK" dbConnection.Close Set dbConnection = Nothing ObjTS.Close Set ObjTS = Nothing Set ObjFSO = Nothing