[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『正規表現:括弧<>で囲まれた部分とそれ以外に分割』(中途B)
すみません。 正規表現を初めて使うもので今一つ理解出来ておらず、ネットで調べながら書いてみたものの、 Patternの記述がこれで合ってるのか、たまたま良さそうなだけなのか自信が無くて、確認頂きたいのです。
「<」と「>」で囲まれている部分と、それ以外の部分に分けて、 ニュアンスとしてはSplit関数の様な結果をMatchCollectionで得たい。というものです。
Sub RegExpTest() Const ORG_STR = "a<123>de>F<><abc><g<>>>" Dim RegExp As RegExp, mc As MatchCollection, m As Match, i As Long Set RegExp = CreateObject("VBScript.RegExp") RegExp.IgnoreCase = True RegExp.Global = True RegExp.Pattern = "((<[^<>]*>)|(.+?(?=<))|(.+))" Set mc = RegExp.Execute(ORG_STR) For Each m In mc Debug.Print m.SubMatches.Count; m.FirstIndex; m.Length; Tab; For i = 0 To m.SubMatches.Count - 1 Debug.Print i; m.SubMatches(i); Tab((i + 2) * 18); Next Debug.Print Next End Sub
実行結果 4 0 1 0 a 1 2 a 3 4 1 5 0 <123> 1 <123> 2 3 4 6 4 0 de>F 1 2 de>F 3 4 10 2 0 <> 1 <> 2 3 4 12 5 0 <abc> 1 <abc> 2 3 4 17 2 0 <g 1 2 <g 3 4 19 2 0 <> 1 <> 2 3 4 21 2 0 >> 1 2 3 >> ↑洩れなく ↑「<」で始まり「>」で終わっているか 全ての文字が 「<」と「>」の間に「<」「>」は無い状態か 順番通りあるか
つまらないお願いかとは存じますが、 アドバイス宜しくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
済みません。 題意をよく読まずに明後日なコメントをしてしまいました。反省。 てっきり対応した括弧を得るという話かと。
コードは問題ないものと思われました。
| ↑洩れなく全ての文字が順番通りあるか これは、(.+)があることで『全ての文字がある』を保証されているわけですね。
なお、最後の<>は、それ自体が<>の中にあり、 言わば第二階層の中にあるわけで、 第一階層の中にある<123>や<abc>と性格が異なると言えば異なります。 そこが(仕様として)少し気にはなりました。
(γ) 2021/09/11(土) 05:27
γさんご確認頂きありがとうございました。
ひとつひとつのメタ文字の役割はネットで調べられたんですが、 組み合わせや、複数パターンになると頭がこんがらがってしまっておりました。
<g<>>> の部分については、 今回は少なくともネストが許容されない前提です。
但し[<]から[>]までが1ペアというルールは決定なのですが、 「間に[<]も[>]も無い」という部分については、実はまだ仕様を決めかねています。
<g | <> | >> と分けるべきか ~~ <g<> | >> と分けるべきか、どっちかな? ~~~~ という感じですが、 そこはもう少し検証を重ねてみてからの判断になります。
とりあえずこれで先に進められます。助かりました。 ありがとうございました。
(中途B) 2021/09/11(土) 09:41
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.