.NET正規表現で(?=...)を使えない?

このQ&Aのポイント
  • お世話になります。.NET正規表現について、(?=...)というパターンを使いたいのですが、使えません。VBScriptやVBAでも同様です。他のパターン(?<=...)や(?<!...)は使えることが分かっています。正規表現自体は合っているようで、テストツールでは動作します。
  • .NET Framework 開発者ガイドのページによると、(?=...)はゼロ幅の正の先読みアサーションであり、(?<=...)はゼロ幅の正の後読みアサーションです。これらはあるパターンが注目している前/後に現れる/現れないかどうかをチェックしますが、キャプチャーしないため、(?=...)と(?<=...)を使用してもエラーが発生します。
  • おそらく、VBScriptやVBAでは(?=...)のような正規表現の構文をサポートしていないため、エラーが発生するのかもしれません。代わりに(?:...)というパターンを使用することで同様の動作を実現できると考えられます。ただし、現在のバージョンのVBScriptやVBAでの正規表現の機能には制約があるため、完全な互換性は保証されていません。
回答を見る
  • ベストアンサー

.NET正規表現で(?=...)を使えない?

お世話になります。 以下のページ(.NET Framework 開発者ガイド>グループ化構成体) http://msdn.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx に、.NET正規表現について以下のようなパターンがあります。  (?= subexpression) ゼロ幅の正の先読みアサーションです。(略)  (?! subexpression) ゼロ幅の負の先読みアサーションです。(略)  (?<= subexpression) ゼロ幅の正の後読みアサーションです。(略)  (?<! subexpression) ゼロ幅の負の後読みアサーションです。(略) これらは、あるパターンが注目している前/後に現れる/現れないかどうかをチェックするけど、それらをキャプチャーしないというものです。 これを使いたいのですが、使えません。以下はVBScriptのプログラムで、WSCript 5.6および5.7で動作させました。(インデントを表現するために全角空白を使っています。実際に動かしてくださる方はタブ文字かなにかに変換願います) Option Explicit Dim objRegExp ' 正規表現オブジェクト Dim objMatches ' 検索結果 Dim objMatch ' 検索結果 Dim strMessage ' 表示メッセージ Set objRegExp = New RegExp objRegExp.Pattern = "(?<=「)[^」]+(?=」)" objRegExp.IgnoreCase = True objRegExp.Global = True Set objMatches = objRegExp.Execute("カッコ前「カッコ中」カッコ後") WScript.Echo objRegExp.Pattern & " は" For Each objMatch In objMatches  strMessage = " " & objMatch.FirstIndex + 1 & _   " 文字目に見つかりました。" & _   "一致した文字列は " & objMatch.Value & " です。"   WScript.Echo strMessage Next Set objMatches = Nothing Set objRegExp = Nothing ところが、  objRegExp.Pattern = "(?<=「)[^」]+(?=」)" のところで「正規表現で構文エラーになりました」となります。 これを、もっと簡単なパターン、  objRegExp.Pattern = "(?:「)[^」]+(?:」)" とすれば動くことは分かっているんですが、今の私の主眼としては「(?<=...)」および「(?=...)」を使いたいんです。 他に、Word 2007 の VBA を試しましたがダメでした。 正規表現自体は合っているようです。 というのは、以下のテストツールで動作できたからです。 http://www.ultrapico.com/Expresso.htm ということで、これらの新しい .NET 正規表現を VBScript や VBA で動かす方法はあるでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

VBScript やVBAの正規表現と.NETの正規表現とは別物です。 .NETのもので使えるものがVBScriptでも使えるとは限りません。 Clinick's Clinic on Scripting: 正規表現による Visual Basic Scripting Edition (VBScript) の機能強化 http://msdn.microsoft.com/ja-jp/library/ms974570.aspx >正規表現自体は合っているようです。 「VBScriptの正規表現」としては正しいものではないですね。 がんばって書き換えてください。

TYWalker
質問者

お礼

ありがとうございます。 てっきりVBScriptの正規表現は.NET互換かと思っていました。 もともとの目的を言うと、.NET正規表現を設定ファイルとして使うアプリケーションの動作をチェックするために、簡単な正規表現チェッカーを作りたかったのでした。 よって、VBA / VBScriptを使って正規表現マッチを使う動作がしたいのが目的ではなく、.NET正規表現を動かすのが目的でした。 Expressoを使えばいいというアドバイスはもらっているのですが、対話式なので、バッチでだーっと複数の表現を複数のデータに当てるということができないので、能率が悪いと思っています。 ということで、.NET正規表現を使う簡便な方法はあるでしょうか。 .NET Frameworkを使えば VS を使わなくても C# が使えるようなので、C#でゴミプロを作って動かせばいいのかなあという気がしますが、やはりスクリプト言語がよいです。

TYWalker
質問者

補足

.NET Frameworkを使えば特にVSなどの有料ソフトを買わなくてもVB.NEtやC#.NETを使えるようなので、それでしのごうと思います。 どうもありがとうございました。 個人的にはVBScriptやWord VBAのRegexpが.NET互換でないというのが意外でした。 (分ける必要性を感じないので~)

関連する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正規表現

    文字列中の両括弧を取り除く正規表現を求めています. 入力文は「(文字列1)文字列2」となっています. 両括弧は全角の丸括弧"(",")"と半角の丸括弧"(",")"のペアを見つけ,文字列2を取り出したいのです. 文字列1,文字列2は全角,半角の文字列(主に全角)が来ます.括弧の中に括弧が入れ子(ネスト)する事は想定していません. 例えば,「(グループA)田中」という入力に対しては,「田中」をExcel VBAで抽出したいのです. 正規表現ライブラリを使っていますが,別の方法でも効率良く抽出できるならOKです. '---------------  以下を試した結果  --------------------------------- Dim RE, strPattern As String, reMatch Set RE = CreateObject("VBScript.RegExp") ' 'strPattern = "^(\(|().*(\)|))$" ' 'strPattern = "(?!.*[(|\(].+?[\)|)])" ' "(グループA)"にマッチする ' 'strPattern = "([\(.+?\)|(.+?)])" ' 'strPattern = "(^[(|\(].+?[\)|)])" ' strPattern = "^(?!.*[(|\(].+?[\)|)])" ' "" ' 'strPattern = "\(.+?\)" ' strPattern = "^(?!.*[\(.+?\)|(.+?)])" ' "" ' strPattern = "(?!.*[(.+?)])" ' "" ' strPattern = "(.+?)" ' "(グループA)"にマッチする ' strPattern = "^[?!.*((.+?))]" ' ' strPattern = "[^((.+?))]" ' ' '.Pattern = "^(?!.*xyz)" ' 'strPattern = "^(?!.*([.+?]))" ' "" ' strPattern = "[^(.*)]" '"グ","ル",,, ' strPattern = "^(?!([.*]).*)" ' "" ' strPattern = "^(?!(.*).*)" ' "" ' strPattern = "^(?!([.*]))" ' "" strPattern = ").*$" ' "" With RE .Pattern = strPattern .IgnoreCase = True .Global = True Set reMatch = .Execute(str) If reMatch.Count > 0 Then str = reMatch(0).Value End If End With '開放 Set reMatch = Nothing Set RE = Nothing

    • ベストアンサー
    • CSS
  • 正規表現について

    ExcelにてVBScriptの正規表現を使用していますが、 理解できないところがあるので、教えてください 1.EXCEL VBAにて下記のコードがあります Sub Sample2() Const strCHK As String = "000AAA111BBB2222BBB333" Dim RE, strPattern As String, i As Long, msg As String, reMatch, Item Set RE = CreateObject("VBScript.RegExp") strPattern = "AAA.+bbb" With RE .Pattern = strPattern .IgnoreCase = True .Global = True Set reMatch = .Execute(strCHK) For Each Item In reMatch Debug.Print Item.Value & " FirstIndex→" & Item.FirstIndex & " Length→" & Item.Length Next End With Set reMatch = Nothing Set RE = Nothing End Sub 2.上記を動作させると、イミディエイトに下記が出力されます AAA111BBB2222BBB FirstIndex→3 Length→16 3.疑問 strPattern = "AAA.+bbb"にて検索しているのに、 AAA111BBBが表示されないのは、何故なのでしょうか? よろしくお願いします

  • 正規表現を用いての置換。

    お世話になっております。 VBScriptで、正規表現を用いての置換がうまくいかないので、ご教授ください。 半角数字に挟まれている、全角の「ー」(長音符)を、半角ハイフンに変換したいと 思っています。 先日ご教授いただいて、以下のように作りました。 --- Set ObjRegExp = Server.CreateObject("VBScript.RegExp") ObjRegExp.Pattern = "([0-9])ー([0-9])" StrHalf = ObjRegExp.Replace(StrHalf, "$1-$2") --- しかし、たとえば 1ー2であれば、1-2となるのですが、 1ー2ー3の時に、1-2ー3(後方が長音符のまま)となってしまいます。 修正すべき点をご教授いただけないでしょうか。

  • 【VBA】【正規表現】

    23歳OLです。 VBAと正規表現についての質問です。 ▼やりたいこと ================================================ 1 | 0 |1234567890 | 2014-2-22 22:22:22.06+09 という数列から 1234567890 という数字のみを抜き出したいです。 正確には2本目の|と3本目の|の間に入っている様々な数字です。 ※桁数が固定されていません。 ================================================ ▼実際書いたコード ================================================ Sub Sample2() Dim RE, strPattern As String, i As Long, msg As String, reMatch Set RE = CreateObject("VBScript.RegExp") strPattern = "☆この部分☆" With RE .Pattern = strPattern .IgnoreCase = True .Global = True For i = 1 To 10 Set reMatch = .Execute(Cells(i, 1)) If reMatch.Count > 0 Then msg = msg & reMatch(0).Value & vbCrLf End If Next i End With MsgBox msg Set reMatch = Nothing Set RE = Nothing End Sub ================================================ ☆この部分に☆に何を入れればよいでしょう? ご指導よろしくおねがいします。

  • 正規表現を使った置換処理。大文字の直前に「_」を入れたい

    正規表現を使った置換処理です。 大文字の直前に「_」を入れたいと思っています。 例:htmlLinkStr → html_Link_Str WSHとして以下のようなコードを1行記述しました。 WScript.Echo("htmlLinkStr".replace(/([A-Z]+)/g, "_" + RegExp.$1)); しかし「html_ink_tr」としょぼい結果しかえられません。 「RegExp.$1」の使い方が悪いのかもしれません…。 ちなみにVBSでは以下のコードで成功しています。 ので大きくはずしてはいないと思うのですが… Set regEx = New RegExp regEx.Pattern = "([A-Z]+)" regEx.Global = True MsgBox regEx.Replace("htmlLinkStr", "_$1") JavaScriptでの正規表現の使い方に詳しい方よろしくお願いします。

  • 正規表現で分かりません

    例えば以下のようなパターンの正規表現チェックがあるのですが、 どのようなものを意味しているか分かりません。 教えていただけますでしょうか。 よろしくお願いします。 以下の情報は調べたのですが。 +(プラス)・・・直前の1文字の1回以上の繰り返しを表現 . (ピリオド)・・・改行コード以外の1文字にマッチするか否か [ ](大括弧)・・・囲みの中に書かれた任意の1文字にマッチするか否か ^([^ ]+) +[^ ]+.+S3.lzh

  • VBScriptでの正規表現パターンマッチ

    ASPプログラムの中で 文字列のパターンマッチを正規表現で行ないたいと考えています。 英字と数字両方を組み合わせた文字列(英字と記号且つ数字)であることをチェックしたいのですが 以下のようなロジックでは、英字、数字どちらかだけの文字列もマッチしてしまうのではと思います。 ほかによい書き方はありますでしょうか? Dim strTEST TESTCHECK = 0 Dim objRE Set objRE = new RegExp objRE.pattern = "[_\-a-zA-Z0-9]" If (objRE.Test(strTEST) = True) Then Else TESTCHECK = 1 End If Set objRE = Nothing よろしくお願いいたします。

  • 正規表現について

    VB6ですが・・・ '次のようなコードがあって <!-- と --> に囲まれる文字列を抜き出したのですが 'どのようなパターンマッチを書けばいいのでしょうか? 'HTMLのコメントのみを抜き出したいと思っています。 Const s = "<!--今日-->" _ & "<!--僕は--><!--正規表現を--><!--勉強します-->" Dim x As RegExp Dim v As match Set x = New RegExp x.Pattern = "パターン" x.Global = True For Each v In x.Execute(s) Debug.Print v.Value Next

  • この正規表現を教えてください

    以下のように複数行にまたがっている括弧の部分を 削除したいのですが、どのような正規表現になりますでしょうか?よろしくお願いします。 あああああ(aaaaaa aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa)

    • ベストアンサー
    • Perl