【问题标题】:regex: match everything, but not a certain string including white sapce (regular expression, inspite of, anything but, VBA visual basic)正则表达式:匹配所有内容,但不匹配某个字符串,包括空格(正则表达式,尽管如此,除了 VBA Visual Basic)
【发布时间】:2021-09-28 22:54:40
【问题描述】:

伙计们,关于“regex: match all, but not ...”已经有数十亿个问题,但似乎不适合我的简单问题。

一个简单的字符串:“1 Rome, 2 London, 3 Wembley Stadium”,我只想匹配“1 Rome, 2 London, 3 Wembley Stadium”,以便只提取名称而不提取等级(“Rome, London, Wembley Stadium” )。

使用正则表达式测试器 (https://extendsclass.com/regex-tester.html),我可以通过以下方式简单地匹配相反的内容:

([0-9]+\s*) 它给了我:

1 Rome, 2 London, 3 Wembley Stadium”。

但是如何扭转呢?我试过类似的东西:

[^0-9 |;]+[^0-9 |;],但它也排除了我想要保留的空格(例如,在逗号之后以及在温布利和体育场之间,“1 Rome, 2 London, 3 Wembley Stadium”)。我想“0-9 ”需要以某种方式确定为一个连续的字符串。我尝试了各种括号,引号,\s*,但没有任何东西。

注意:我在 Visual Basic 环境中工作,不允许后视!

【问题讨论】:

  • 尝试\d+\s*(.*?)(?:,|$) 并从match.Submatches(0) 获取值。见the regex demo
  • 如果你的字符串真的那么简单,你也可以使用Split 函数来获取像Split(simpleStr,",") 这样的数组,然后使用Right 和Instr 来检查每个项目中的第一个空格。
  • 或者,\d+\s*(.*?)(?=,\s*\d+\s|$),参见this regex demo
  • \d+\s*(.*?)(?=,\s*\d+\s|$) 匹配除“, ”之外的所有内容,但我需要匹配所有内容,但“1 ”、“2 ”、...(注意空格数字后面)
  • 不,\d+\s*(.*?)(?=,\s*\d+\s|$) 捕获您在第 1 组中需要的东西。它匹配什么并不重要。

标签: vba regex-lookarounds regex-negation lookbehind


【解决方案1】:

你可以使用

\d+\s*(.*?)(?=,\s*\d+\s|$)

查看regex demo,从match.Submatches(0) 获取值。 详情

  • \d+ - 一位或多位数字
  • \s* - 零个或多个空格
  • (.*?) - 第 1 组:除换行符之外的零个或多个字符尽可能少
  • (?=,\s*\d+\s|$) - 正向前瞻,需要 ,、零个或多个空格、一个或多个数字,然后在当前位置右侧紧邻字符串的空格或结尾。

这是一个如何获取所有匹配项的演示:

Sub TestRegEx()
    Dim matches As Object, match As Object
    Dim str As String

    str = "1 Rome, 2 London, 3 Wembley Stadium"
    
    Set regex = New regExp
    regex.Pattern = "\d+\s*(.*?)(?=,\s*\d+\s|$)"
    regex.Global = True

    Set matches = regex.Execute(str)
    
    For Each match In matches
        Debug.Print match.subMatches(0)
    Next
End Sub

输出:

【讨论】:

  • @Wiktor,我知道与不知道他们在说什么的人讨论令人沮丧,但我无法重现它。 1. 我在extendsclass.com/regex-tester.html#js 中尝试了正则表达式,但它包含数字。 2. 我尝试在 Excel 中运行您的宏,但得到“编译错误:未定义用户定义类型”和 3. 我在 VBA 函数 (stackoverflow.com/questions/68349611/…) 中尝试了正则表达式,它包含如下所示的数字:@ 987654325@.
  • @MsGISRocker 1) 如果您不知道如何使用在线正则表达式测试人员的正则表达式,请不要使用它们,依靠专家的建议(真的,lot of people do not understand how to use online regex testers)。 2) 尝试用谷歌搜索这些错误,this is the solution,3) 你为什么尝试使用不打算与 my 正则表达式一起使用的代码?引用正确的库后使用我的代码
  • 好的,我让你的脚本运行起来了,是的,它确实符合我的要求。但是,它只在您的脚本中这样做,而不是在我希望它工作的函数中(stackoverflow.com/questions/68349611/…)。有没有更普遍适用的解决方案?顺便说一句,我欠你一杯咖啡!
  • @MsGISRocker 在 Stackoverflow,我们只能回答被问到的问题。如果您发布代码,我可以尝试调整解决方案以适合您的代码。没有那个,我只能建议我有什么。
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多