2011-12-06 42 views
4

我想下面的函數來驗證一個字符串,如果它看起來像這樣:Excel的VBA正則表達式

  • 任何數字(包括分數和小數。)
  • 的片/袋/盒可選一個同義詞
  • 任選的一種/陰同義詞
每個之間

可以是空間和2個可選部分的順序物質不應該(「2框男性」 ==「2雄性框」)

但是在做什麼有用的東西該功能節選以數字開頭的一切:

Function validAmount(Zelle As Variant) 
Set regEx = CreateObject("VBScript.RegExp") 
regEx.IgnoreCase = True 
regEx.Pattern = "\d\s?(pcs|pieces|piece|pc|stk|bags|bag|box|bx|boxes)?\s?(male|m|female|f)?" 
If (regEx.test(Zelle)) Then 
    validAmount = True 
Else 
    validAmount = False 
End If End Function 

我希望我的錯誤是不是太傻

編輯: 我想到了一個附加功能。我怎麼能讓上述模式的多個實體通過一個「,」像「1盒女,3袋m,4件男」分開

ps:這兩種解決方案工作得很好,但允許像這樣的「1男性女性」或「2盒包」

編輯2: 首先:我非常感謝您的幫助!我從來沒有自己解決這個問題!我想點擊「解決」(不能點擊「上升」,因爲我的聲望仍然太低),只要一切按預期工作。如果我早點擊它,我很抱歉。這是我的第一個問題,我有點不知所措,你的答案有多快:)

我想我無法表達我的願望:D真的對不起!這裏是第三次嘗試:只有(至少)每個組應允許其中一組。真正的投入應該是: 「#箱性別」 「#性別盒子」 「#盒」 「#性別」 「#」 但不是: 「#箱箱」 或 「#男女性別」

@sln:我覺得你的第一個看起來更像我想要的,但它允許同一組的兩個實例,儘管它看起來像它不應該:(對於JMax解決方案相同)

@JMax:我愛你「分裂」解決方案!甚至沒有想到這個簡單的伎倆:DI是如此固定在正則表達式,沒有想到任何其他

+0

你應該有權利現在upvote :) – JMax

回答

3

這是一個嘗試:

Function validAmount(Zelle As String) 
Dim sBoxes As String, sGender As String 
Dim arr() As String 
Dim i As Integer 

arr = Split(Zelle, ",") 
sBoxes = "pcs|pieces|piece|pc|stk|bags|bag|box|bx|boxes" 
sGender = "male|m|female|f" 

validAmount = True 
For i = 0 To UBound(arr) 
    Set regEx = CreateObject("VBScript.RegExp") 
    regEx.IgnoreCase = True 
    regEx.Pattern = "\d\s?(((" & sBoxes & ")?\s?(" & sGender & "))|((" & sGender & ")?\s?(" & sBoxes & ")))?$" 
    If (regEx.test(arr(i))) Then 
     validAmount = validAmount And True 
    Else 
     validAmount = validAmount And False 
    End If 
Next i 
End Function 

,這裏是一個測試過程:

Sub unitTest() 
'could use debug.Assert too 
Debug.Print (validAmount("1 box") & " should be True") 
Debug.Print (validAmount("1 boxe male") & " should be False") 
Debug.Print (validAmount("1 pcs female") & " should be True") 
Debug.Print (validAmount("1boxes") & " should be True") 
Debug.Print (validAmount("1 female pcs") & " should be True") 
Debug.Print (validAmount("boxes") & " should be False") 
Debug.Print (validAmount("2 male box") & " should be True") 
Debug.Print (validAmount("1 mytest") & " should be False") 
Debug.Print (validAmount("1 pc box") & " should be False") 
Debug.Print (validAmount("1 box box") & " should be False") 
Debug.Print (validAmount("1 box female, 3 bags m, 4pcs male") & " should be True") 
End Sub 

我已經改變了箱子和性別爲字符串,這樣就可以在你的模式同時添加(我不知道知道任何方式檢查訂單沒有那個伎倆。有人有更好的主意嗎?
我還添加了$來告訴Excel這是字符串的末尾,否則任何以數字開頭的字符串都會通過。

+0

幾乎完美的作品。唯一的問題是,具有兩個相同組的字符串(「1 pc box」或1「female male」)也可以使用 – Marc

+0

我的解決方案也適用於這種情況...我編輯了我的帖子以滿足您的新需求(數組作爲輸入) – JMax

+0

你介意看看我的編輯嗎? – Marc

2

這將工作,如果你的vba至少可以做前瞻斷言。我以爲我讀它像javascript一樣的正則表達式。如果是這樣,這是有效的。但是如果不是,不管。

它並不那麼容易解釋,所以它的功能是細分的。

^\d(?:\s?(?:(?!\1)(?:pcs|pc|pieces|piece|stk|bags|bag|boxes|box|bx)()|(?!\2)(?:male|m|female|f)()|)){2}$

擴展:

^    # Begining of string 

    \d     # A digit 
    (?:     # Grouping 
     \s?       # Optional whitespace 
     (?:        # Grouping 
      (?!\1)           # Never been here before, capt grp 1 is undefined 
      (?:pcs|pc|pieces|piece|stk|bags|bag|boxes|box|bx) # One of these alternations is found 
      ()            # Mark we've been here, Capt Grp 1 is defined 
     |           # OR .. 
      (?!\2)           # Never been here before, capt grp 2 is undefined 
      (?:male|m|female|f)        # One of these alternations is found 
      ()            # Mark we've been here, Capt Grp 2 is defined 
     |           # OR .. 
                  # Nothing, this allows to pick optional \s only, or combined 
     )         # End grouping 

    ){2}    # End grouping, do exactly 2 times 

$    # End of string 

編輯

爲了解決您的編輯一個炮打響,下面的正則表達式將起作用。如果你想讓任何一組改變都可以接受,將它們組合成一個改變。如果發生命名衝突,可能會出現這種問題。這是因爲你正在做兩次。另外,間距是一個大問題嗎?

下面有2個正則表達式。

這一個是非常嚴格的間距。它更符合你陳述問題的方式。它不是一個好主意。

^(?=\d)(?:\d(?:\s?(?:pcs|pc|pieces|piece|stk|bags|bag|boxes|box|bx|male|m|female|f|)){2}(?:,\s?(?=\d)|$))+$

這一個是間隔完全以輕鬆而maintaning的corect非空白表格。
這是推薦的版本。隨意更改正則表達式中的間距結構。

^(?=\s*\d)(?:\s*\d(?:\s*(?:pcs|pc|pieces|piece|stk|bags|bag|boxes|box|bx|male|m|female|f|)){2}\s*(?:,(?=\s*\d)|$))+$

這是擴大,看到從上面的差異初始膨脹的正則表達式的意見。

^ 
    (?=\s*\d) 
    (?: 
     \s* 
     \d 
     (?: 
      \s* 
      (?:pcs|pc|pieces|piece|stk|bags|bag|boxes|box|bx|male|m|female|f|) 
    ){2} 
     \s* 
     (?: 
      , (?=\s*\d) 
     | $ 
    ) 
    )+ 
$ 
+0

展望未來支持。看後面,不。 :) – aevanko

+0

好的,那麼這個正則表達式將工作。無論如何,沒有理由背後。 – sln

+0

幾乎完美。唯一的問題是具有兩個相同組的字符串(「1 pc box」或1「female male」)也可能被盜用 – Marc