仅限大写字母,数字和短划线的正则表达式

时间:2016-03-08 17:19:40

标签: regex vba

我已经在这个表情上挣扎了2天,所以我想我会从知识世界中寻求一些适当的帮助。我希望有人可以提供帮助。

这是我为了得到我想要的而建立的RegEx。

\S*\d*?-[A-Z]*[0-9]*

我只想要带有破折号的大写字母和数字,所以它确实得到GC-113AO-1-GC-113AO-2-GC-113,这太棒了!

“我不希望这个------,但这很好GC-113AO-1-GC-113AO-2-GC-113

但是如果我遇到一个数字之间没有空格的地方,而只是逗号或句号之间的另一个字符,那么它会在整个部分“GC-113,AO-1-GC-113,AO-2-GC-113”上返回一个匹配

“我不希望这个------,但这很好GC-113,AO-1-GC-113,AO-2-GC-113

我正在使用RegExBuddy尝试解决这个问题。

这是我正在使用的VBA代码获取匹配。

Public Function GetRIs(ByVal vstrInString As String) As Collection
Dim myRegExp As RegExp
Dim myMatches As Variant
Dim myMatch As Variant

Set GetRIs = New Collection
Set myRegExp = New RegExp

myRegExp.Global = True
myRegExp.Pattern = "\S*\d*?-[A-Z]*[0-9]*"
Set myMatches = myRegExp.Execute(vstrInString)

For Each myMatch In myMatches
    If myMatch.Value <> "" Then
        GetRIs.Add myMatch.Value
    End If
Next

End Function

谢谢! 戴夫

1 个答案:

答案 0 :(得分:1)

您的\S*\d*?-[A-Z]*[0-9]*模式甚至可以匹配单个连字符,因为只有-是强制性的,其余的子模式可以匹配零次(可以在字符串中不存在)。

您可以使用

myRegExp.Pattern = "\b[A-Z0-9]+(?:-[A-Z0-9]+)+"

pattern matches

  • \b - 一个单词边界(在下一个字母或数字之前必须有一个非单词字符或字符串的开头
  • [A-Z0-9]+ - 一个或多个字母或数字
  • (?:-[A-Z0-9]+)+ - 1个或多个序列:
    • - - 连字符
    • [A-Z0-9]+ - 一个或多个字母或数字