正規表現 さらに続き
とても地味な記事が続いていますね。でもこれは乗り越える必要があるところなので,まだやってます。
前回は化学反応式を簡単な部品に分けることをやりましたので,さらにさらに分けることに取り組んでみました。
とはいえ,ムズカシイ。なんとなくパーツの意味はわかっている実感はあるんですが,うまく書けないです。
特にSubMatchesを使いこなしたいんですが,思い通りにはいきませんでした。
ただ,そのまま負けるのもくやしいので,二段階でやろうと思い,とにかくばらばらに分解することをやりました。
Sub test2() Dim Regex As VBScript_RegExp_55.RegExp, subRegEx As VBScript_RegExp_55.RegExp Set Regex = New VBScript_RegExp_55.RegExp Set subRegEx = New VBScript_RegExp_55.RegExp Dim ret As VBScript_RegExp_55.MatchCollection Dim RegMatches As VBScript_RegExp_55.MatchCollection Dim RegMatches2 As VBScript_RegExp_55.MatchCollection Dim Chem As Variant Dim strChem As String strChem = "Ca(OH)2+2HCl→CaCl2+2H2O" Dim strPattern As String strPattern = "[0-9A-Za-z\(\)]+|! +|→" With Regex .Pattern = strPattern .IgnoreCase = False .Global = True Set RegMatches = .Execute(strChem) End With Dim Result As Collection: Set Result = New Collection Dim strPattern2 As String strPattern2 = "([0-9]+|[A-Z][a-z]?)|\(|\)" For Each Chem In RegMatches With subRegEx .Pattern = strPattern2 .IgnoreCase = False .Global = True Set RegMatches2 = .Execute(Chem) End With Result.Add RegMatches2 Next Dim i As Long, j As Long For i = 0 To RegMatches.Count - 1 Debug.Print RegMatches(i) For j = 0 To Result(i + 1).Count - 1 Debug.Print vbTab; Result(i + 1)(j) Next Next End Sub
実行すると,イミディエイトウィンドウに結果を吐き出します。
Ca(OH)2 Ca ( O H ) 2 2HCl 2 H Cl → CaCl2 Ca Cl 2 2H2O 2 H 2 O
こんな感じです。ほんとバラバラにできました。
チェックとしてこんなのも
strChem = "2NaHCO3→Na2CO3+H2O+CO2"
2NaHCO3 2 Na H C O 3 → Na2CO3 Na 2 C O 3 H2O H 2 O CO2 C O 2
ちゃんと動いてそうですよね。
これだけのことを今回のコードの長さでできる時点ですごいなと思いますが,もっとうまく書ければたぶん,一発でSubMatchesまで含めて完全に分解できる力があると思うんですよね。
修業が足りませんね(;´▽`A``
引き続き精進します。