【发布时间】: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