2017-07-13 7 views
0

いくつかのプレフィックスと余分な文字を削除した後、特定の単語を抽出するために、Excelで一連の文字列をクリーンアップしようとしています。最初は、FIND、LEFT、MIDなどでこれを試していました。そして、この役に立つポストを見つけて、正規表現で手を試してみました。Excelから単語の特定のプレフィックスを削除する正規表現パターン

https://superuser.com/questions/794536/excel-formulas-for-stripping-out-prefix-suffix-around-number

私は正規表現の引数を取るの削除と呼ばれるが与えられたUDFを使用していました。今、私は削除したいアイテムをすべて削除できません。

添付のExcelには、私が何を試したか、そして私が見ている答えを見ることができます。 削除したいプレフィックスは次のとおりです。 括弧で囲まれた最初の数字 - 理想的には別の列に入れてください。 ハイフンの前には、 'l-'、 'al-'のような数字があります。 、次にこれらの接頭辞があります。 バイ 億FA WA WAL

どのように私は上記のすべてのプレフィックスを削除します単一の正規表現を書くのですか?データIが含まれているXLSMファイルへのリンク 機能の削除(文字列としてobjCellとしてレンジ、strPattern)

Dim RegEx As Object 
Set RegEx = CreateObject("VBScript.RegExp") 
RegEx.Global = True 
RegEx.Pattern = strPattern 
Remove = RegEx.Replace(objCell.Value, "") 

エンド機能ここで

されています。ここでは

は、私が使用していますUDFです持っている: https://www.dropbox.com/s/et9ee727ompj5fl/Regex%20Trials.xlsm?dl=0

、ここでは、私が探しています何を表示するスクリーンショットです:

enter image description here

+2

私はVBAでどのように機能するかを正規表現パターンを知りませんが、私は」あなたを想定し文字列の先頭に正規表現を固定するにはキャレットシンボルが必要で、グループ式には縦のバーシンボル、オプションのマッチでは疑問符シンボルが必要です。 perl互換の正規表現では、(?!\ w)を使用して、単語の文字が続かないように指定することもできます。たとえば、 'Regex.Replace(Obj.CellValue、" ^(l- | al- | bi | bil | fa | wa | wal) ")'または '^(l- | al- | bi | bil | fa | wa | wal)(?!\ w) 'を実行します。それは役に立ちますか? – rubystallion

+0

@rubystallion、ありがとう。それは間違いなく助けになります。投稿されたすべてのソリューションの中で、あなたのソリューションは私に何か具体的なことを教えてくれました。正規表現パターンはVBAでも他の言語と同様に動作すると思います。少し遊んだ後、私はこのパターンが(l- | al- | bi- | bil | fa | wa- | wa)の多くの答えにマッチすることを発見しました。ここで、私がキャレットシンボルを持っていれば、それは動作していないようです。どうして?この場合も、[0-9 :()]を使用して括弧内の数字を削除するために別の正規表現を書く必要がありました。両方を単一の正規表現に結合する方法はありますか? –

答えて

0

私はこのために正規表現を使用することはありません:あなたは前に追加の定義された配列に対して前に追加のセル値とテストのいくつかの分割を行うことができます。

注:配列値であります他の前に追加のストリングが後に、リスト内の単語のための完璧な

Public Function RemovePrefix(RngSrc As Range) As String 
    If RngSrc.Count > 1 Then Exit Function 

On Error GoTo ExitFunction 
    Dim Prefixs() As String: Prefixs = Split("wal,wa',wa,bil,bi,fa", ",") 

    Dim Arr() As String, i As Long, Temp As String 

    Arr = Split(RngSrc, "-") 
    If UBound(Arr) > 0 Then 
     RemovePrefix = Arr(UBound(Arr)) 
     Exit Function 
    End If 

    Arr = Split(RngSrc, " ") 
    For i = 0 To UBound(Prefixs) 
     Temp = Arr(UBound(Arr)) 
     If InStr(Temp, Prefixs(i)) = 1 Then 
      RemovePrefix = Right(Temp, Len(Temp) - Len(Prefixs(i))) 
      Exit Function 
     End If 
    Next i 
    RemovePrefix = Temp 

ExitFunction: 
    If Err Then RemovePrefix = "Error" 
End Function 
+0

また、接頭辞としてwa 'を追加しました。これは、例のデータの最後から二番目の行から示されているようです。 – Tragamor

+0

なぜ 'RegEx'を使用しないのですか?あなたがしていることは、それ自身のバージョンを構築していることです – Tom

+0

ほとんど、私はそれをあまり使っていないので、命名法はちょっとしたものです。上記のコードでは、配列の値を変更することによって接頭辞を簡単に追加または変更することができます。 (私はあなたも同様に正規表現で同じことをすることができると知っています) – Tragamor

0

ない100%ですが、あなたは

始める必要があるために、正規表現 (\d+\:)+\d+

(\d+\:)

内訳は、これは繰り返しパターンであることを告げるx:

プラスブラケット後フォーマットに一致するパターンを発見します。正規表現はx:x:x

次の正規表現(?!l-|al-|a-|wa-|fa-|bi-)[a-z].*が多く、より複雑であると一致するパターンを見つけるように 最後\d+は、文字列の最後の数字と一致します。 まずは[a-z]を見てください。これは、aとzの間の任意の文字に一致するように指示します。その後、残りの単語をキャプチャしたいので、.*を使用して、最初の一致から文字列の最後までのすべてをキャプチャします(これにはa-z以外の文字が含まれます)。しかし、ハイフン(ほとんどの場合)の前に文字列の最初の部分をキャプチャしたくないので、?!を使用します。ネガティブ・ルック・アヘッドと呼ばれるものを使用します。これは括弧の中のものを探し、それらのビットを無視します。 |は単にまたはを意味します。その括弧の中の何かがマッチから無視されます。あなたの周りに遊びを持っているしたい場合はhttp://regexr.com/に行く して学ぶための便利なサイト/テスト正規表現である

Public Sub test() 
    Dim rng As Range 
    Dim matches 
    Dim c 

    With Sheet1 
     Set rng = .Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)) 
    End With 

    For Each c In rng 
     With c 
      .Offset(0, 6) = ExecuteRegEx(.Value2, "(\d+\:)+\d+") 
      .Offset(0, 7) = ExecuteRegEx(.Value2, "(?!l-|al-|a-|wa-|fa-|bi-)[a-z].*") 
     End With 
    Next c 

End Sub 

Public Function ExecuteRegEx(str As String, pattern As String) As String 
    Dim RegEx As Object 
    Dim matches 

    Set RegEx = CreateObject("VBScript.RegExp") 
    With RegEx 
     .Global = True 
     .ignorecase = False 

     .pattern = pattern 
     If .test(str) Then 
      Set matches = .Execute(str) 
      ExecuteRegEx = matches(0) 
     Else 
      ExecuteRegEx = vbNullString 
     End If 
    End With 
End Function 
+0

こんにちはTom、答えに来てくれてありがとう。しかし、正規表現の実際の仕組みを理解するには、いくつかのコメントが必要です。 2 Regexは何をしていますか?私は、私が持っていた事例の両方でそれらを試してみました。だから、上記の2つの正規表現のそれぞれが私が与えた例でどのように動作しているかについての説明が必要です。 –

+0

私はregexの周りのノートで更新しました。どのように正確に動作していないのですか? – Tom

関連する問題