2016-03-08 112 views
1

我曾与该表达式现在奋斗2天,所以我想我会要求从知识的世界一些适当的帮助。我希望有人能帮帮忙。正则表达式大写字母,数字及破折号只有

这是我建让我我想要的正则表达式。

\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 

谢谢!因为只有-是强制性的子模式的其余部分可以匹配零次(可从字符串缺席) 戴夫

+0

我觉得你正在寻找['\ w +( - ?\ w +)*'](HTTPS ://regex101.com/r/hK4tZ2/1) –

+0

@DaveStuart - 编辑您原来的职位与VBA代码。此外,我已格式化您的问题。如果有任何格式不正确(“我不想这样[...]”),请正确格式化。 –

+0

Wiktor,那个人得到所有文本。我正在寻找一个更具体的正则表达式来获取这三种组合GC-113,AO-1-GC-113,AO-2-GC-113。 –

回答

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]+ - 一个或多个字母或数字
+1

谢谢Wiktor!这很好地工作,也谢谢你如此清楚地解释一切。 –

相关问题