[[20151120171609]] 『正規表現について』(T1511) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『正規表現について』(T1511)

文字列操作で「正規表現」がわからずお助けください。

問い)
下記の文章で最後の「▼○○」を表現する正規表現は?
例文
△△▼○○▼□□▼○○
説明
・△、□、○は任意の文字列です(文字種、文字長は不定です)
・区切り記号として「▼」を使用しています
・「△△▼○○▼□□▼○○」を「△△▼○○▼□□」に修正する
 マクロを検討中ですが、いきなり躓いています..

よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


正規表現と文字列置換をどう組み合わせたいのか判らないのですが、こういうこと?

 Sub test()
    Dim cw As String

    cw = "△△▼○○▼□□▼○○"
    If cw Like "*▼○○" Then
        cw = Left(cw, Len(cw) - 3)
    End If
    MsgBox cw
 End Sub
(???) 2015/11/20(金) 17:38

 よくわかりませんが、末尾の ▼○○ 

 ▼ は、実際にはどんな文字ですか? 実際に ▼なんですか?
 それと ○○ は、桁数としては 2桁と限ったことではないということですか? それとも 2桁?
 また、文字列の内容も可変?

 2桁で、文字列の内容も固定なら、何も正規表現を持ち出すまでもなく、(???)さんの回答で解決だと思いますが?

(β) 2015/11/20(金) 17:51


 実際の仕様がいまいちわからないところもありますが

 Sub Test()
    Dim s As String
    Dim re As Object
    Dim mt As Object

    s = "△△▼○○▼□□▼○○"

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "▼[^▼]+$"
    Set mt = re.Execute(s)
    If mt.Count > 0 Then
        MsgBox mt(0).Value & vbLf & "開始位置:" & mt(0).firstindex + 1 & vbLf & "桁数:" & mt(0).Length
        MsgBox "結果:" & Left(s, mt(0).firstindex)
    End If

 End Sub

(β) 2015/11/20(金) 17:58


 こんなのでも、充分かも。

 Sub Test2()
    Dim s As String
    Dim w As Variant

    s = "△△▼○○▼□□▼○○"

    w = Split(s, "▼")
    ReDim Preserve w(0 To UBound(w) - 1)

    MsgBox Join(w, "▼")

 End Sub

(β) 2015/11/20(金) 18:03


 正規表現なら

 Sub test()
    With CreateObject("VBScript.RegExp")
        .Pattern = "[^▼]+(?!.)"
        MsgBox .Replace("△△▼○○▼□□▼○○", "")
    End With
End Sub
(seiya) 2015/11/20(金) 18:14
 チョイ修正 20:25

 あぁ、Replace ですね。あまり使わないので、思いつきませんでした。

 Sub Test3()
    Dim s As String
    Dim re As Object
    Dim mt As Object

    s = "△△▼○○▼□□▼○○"

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "▼[^▼]+$"
    MsgBox re.Replace(s, "")

 End Sub

(β) 2015/11/20(金) 19:10


???様、β様、seiya様

みなさん、ありがとうございます。
時節柄、 今、 ちょっと思考がついていけないため、
日を改めて確認させていただきます。 スミマセン...

(T1511) 2015/11/20(金) 21:53


「▼」を区切り文字と考え、つねに最後の区切りをカットしたいということなら、
正規表現をつかわなくても良いように思いました。
2015/11/20(金) 18:03 のβさんの回答が簡明な気がしました。

正規表現を使った案がたくさん提示されていて勉強になります。

余談です。
私は、最初に見たとき、こんな解釈をしてしまいました。
「▼」を区切り文字と考え、同一内容が出てきたら、後のほうを消去したい。
これなら正規表現を使いたくなるかもしれないと思いました。

(γ) 2015/11/21(土) 08:44


 MsgBox Left$("△△▼○○▼□□▼○○", InStrRev("△△▼○○▼□□▼○○", "▼") - 1)
(seiya) 2015/11/21(土) 11:32

 もし、γさんコメントの様に、区切り文字で区切られた文字列の重複を削除して一意化するとすれば
 こんなコードでもできますね。

 Sub Test4()
    Dim w As Variant
    Dim d As Variant

    w = Split("△△▼○○▼□□▼○○", "▼")

    With CreateObject("Scripting.Dictionary")
        For Each d In w
            .Item(d) = True
        Next
        MsgBox Join(.keys, "▼")
    End With

 End Sub

(β) 2015/11/21(土) 18:24


 ユニーク値を抽出

 Sub tests()
    Dim txt As String
    txt = "△△▼○○▼□□▼○○▼△△▼□□"
    With CreateObject("VBScript.RegExp")
        .Pattern = "(.*)([^▼]+)(.*)(▼\2)(▼.*)*$"
        Do While .test(txt)
            txt = .Replace(txt, "$1$2$3$5")
        Loop
        MsgBox txt
    End With
End Sub
(seiya) 2015/11/21(土) 19:28

みなさま、いろいろなご提案ありがとうございます。
ひとつひとつ確認して大変勉強になりました。
正規表現でなくても..というご意見も大いに参考になりました。
これから先まだ作業が必要ですが、トライしたいと思います。

質問を補足しますと、“備忘録”として書き留めていたファイルに、
誤って文末に入力した文章を一括削除するのが最終目的です。
備忘録への新規登録は行を新たに追加したり、入力済みの行末に
追加したりしますが、必ず「▼」を区切りとして一緒に入力しており
これを目印に何とかしたいという思いでした。

単なる風邪と思っていたのがインフルで..(まだ頭がボ〜としてますが)
確認〜お礼が遅れてスミマセンでした。

これからもよろしくお願いします。
(T1511) 2015/11/24(火) 11:07


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.