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是如此固定在正则表达式,没有想到任何其他
这是一个尝试:
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这是字符串的末尾,否则任何以数字开头的字符串都会通过。
这将工作,如果你的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)
| $
)
)+
$
你应该有权利现在upvote :) – JMax