【问题标题】:Regex for Uppercase Letters, Numbers and dashes only仅适用于大写字母、数字和破折号的正则表达式
【发布时间】:2016-03-08 17:19:39
【问题描述】:

我已经为这个表达挣扎了 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

谢谢! 戴夫

【问题讨论】:

  • 感觉你在找\w+(?:-\w+)*
  • @DaveStuart - 使用 VBA 代码编辑您的原始帖子。我也格式化了你的问题。如果任何内容的格式不正确(“我不想要这个 [...]”),请正确格式化。
  • Wiktor,那个人得到了所有的文字。我正在寻找更具体的正则表达式来将这 3 种组合从 GC-113、AO-1-GC-113、AO-2-GC-113 中提取出来。
  • 你的意思是你只想要一个[A-Z0-9]+(?:-[A-Z0-9]+)+?提示:当您在评论中称呼 SO 用户时,请始终在用户名前添加 @,以便用户收到回复通知。

标签: regex vba


【解决方案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]+ - 一个或多个字母或数字

【讨论】:

  • 感谢维克托!效果很好,也感谢您如此清楚地解释所有内容。
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多