Excel的VBA正则表达式

问题描述:

我想下面的函数来验证一个字符串,如果它看起来像这样: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

这是一个尝试:

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

这将工作,如果你的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