2017-02-07 8 views
4

私は、正当性を検証したいユーザー入力があります。ユーザーはカンマで区切って1組以上の文字を入力する必要があります。Excel VBA Regex Check for Repeated String

したがって、これらは

  • 有効な入力ですCOM1
  • COM1、COM2,1234

これらは

  • COM無効である - 、唯一の3文字
  • COM1 123 - 1セットは3文字のみです
  • COM1.1234、ABCD - 私はこれに正規表現パターンをグーグル及び任意の3つの文字の繰り返しインスタンスについて試験可能なパターンを発見し、そして私は

    ように改変

コンマないドットセパレータ

/^(.{4,}).*\1$/

これは一致するものが見つかりません。

テストにパスする前に、最後にカンマがあってもなくてもかまいませんが、常にそこにあるように管理できます。

好ましくは、文字(任意の場合)と数字だけをテストしたいと思いますが、私は任意の文字で生きることができます。

コンマ区切り文字で入力を分割し、各配列要素の各文字をループするVBAでこれを簡単に行うことができますが、正規表現はより効率的であるように見えます。そのための正規表現をパラメータ化する方がより良い設計になります。

TIA

答えて

3

私はこれが何をしたいん信じる:

^([A-Z|a-z|0-9]{4},)*[A-Z|a-z|0-9]{4}$ 

それは4の1つのグループに続いて、コンマで終わる4つの文字や数字のゼロ以上のグループに続いて始まる行です文字または数字の後に改行が続きます。

あなたはここでそれで遊ぶことができます:https://regex101.com/r/Hdv65h/1

+0

ニースダグ。事前入力済みの回答へのリンクも非常に便利です。 – brettdj

+0

ブレットに感謝します。うん、それは便利なサイトです。それとメモ帳の間に+私は通常、正規表現を働かせることができます。 –

2

正規表現

"^[\w]{4}(,[\w]{4})*$" 

は動作するはずです。

次の機能を使用して、すべてのケースで機能するかどうかを確認することができます。テスト文字列がスプレッドシートのセルA1〜A5にあると仮定します。

Sub findPattern() 
    Dim regEx As New RegExp 
    regEx.Global = True 
    regEx.IgnoreCase = True 
    regEx.Pattern = "^[\w]{4}(,[\w]{4})*$" 
    Dim i As Integer 
    Dim val As String 
    For i = 1 To 5: 
    val = Trim(Cells(i, 1).Value) 
    Set mat = regEx.Execute(val) 
    If mat.Count = 0 Then 
     MsgBox ("No match found for " & val) 
    Else 
     MsgBox ("Match found for " & val) 
    End If 
Next 
End Sub