【问题标题】:regex: match everything, but not a certain multiletter string within VBA Excel function (regular expression, inspite of, anything but, visual basic)正则表达式:匹配所有内容,但不匹配 VBA Excel 函数中的某个多字母字符串(正则表达式,除了 Visual Basic 之外的任何内容)
【发布时间】:2021-09-30 15:49:38
【问题描述】:

伙计们,这是另一个关于“regex: match all, but not ...”的内容,但到目前为止似乎不适合我的简单问题。

我需要编写我的 Excel 函数以将字符串与其前面的枚举数分开(类似于此处所做的:VBA regex: extract multiple strings between strings within Excel cell with custom function

我的第一个简单字符串是:“1 Rome; 2 London; 3 Wembley Stadium

我的第二个字符串看起来像:“1.1 Winner; 2.1 Looser; 3.3 Penalties (always loose, dam)

我只需要提取名称而不是等级(例如“Rome; London; Wembley Stadium”和“Winner; Looser; Penalties (always loose, dam)”)。

使用正则表达式测试器 (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 环境中工作,不允许后视!
注意:我的解决方案需要尽可能跨 Excel 版本兼容!强>

【问题讨论】:

  • 如果你想得到一个单独的名字列表,那么在; 上拆分并循环删除前导空格/数字将是一种简单的方法。如果您希望将单个字符串中的名称放在一起,则只需匹配数字部分 (\d*(\.?\d+)\s+) 和 RegEx。将其替换为 ""
  • 您应该简单地添加 (?:\.\d+)* 以匹配出现零次或多次的 . 和一个或多个数字 \d+(?:\.\d+)*\s*(.*?)(?=;\s*\d+(?:\.\d+)*\s|$)
  • 这个方案解决问题了吗?
  • @Wiktor:不知何故,它没有,尽管它对我来说是合乎逻辑的。它还包括我的 VBA 函数中的数字前缀。不知道为什么。
  • 再次,仅使用match.Submatches(0)。当然这个数字会出现在整场比赛中。

标签: regex vba regex-lookarounds regex-negation lookbehind


【解决方案1】:

我尝试将数值和句点否定为“一个连续字符串”([^\d|\.])。这将在某些地方保留两个空格。

逐组解说regexr

要删除这些双空格,请尝试使用 ([^\d|\.])(?<!; ) 在这里我只是在后面添加一个负面外观,可能并非所有正则表达式解释器都支持。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 2019-02-15
    • 2023-03-08
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多