首页 > 解决方案 > 用于匹配除特定单词之外的字符串的正则表达式

问题描述

在 Excel VBA 中,我正在尝试使用正则表达式方法来匹配字符串。一旦匹配发生,我希望匹配的字符串包含整个字符串,除非在匹配字符串结束后出现关键字。说明不同,正则表达式模式如下:

pattern = (CHECKOUT[a-zA-Z_(/ ):]+\w+:\w+\s((AM|PM)|(am|pm))\s\-\s\w+:\w+\s((AM|PM)|(am|pm)))

输入的字符串是:

1. CHECKOUT Senior Guest Services Manager FRONTENDMGR: 07:00 AM - 08:30 AM SGSM_BOOKKEEPING: 08:30 AM - 01:00 PM FRONTENDMGR: 01:00 PM - 04:00 PM

2. CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM DRY GOODS Receiving Clerk RECEIVE: 04:30 AM - 09:00 AM 

3. DRY GOODS Receiving Clerk RECEIVE: 04:30 AM - 09:00 AM CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM

对于第一个字符串,我希望返回整个字符串,但只返回以下内容: CHECKOUT Senior Guest Services Manager FRONTENDMGR: 07:00 AM - 08:30 AM

对于第二个字符串,我只希望返回从“CHECKOUT”到“01:00 PM”的字符串的第一部分,并且效果很好。

对于第三个字符串,我只希望返回“CHECKOUT”到“01:00 PM”之间的部分并发生这种情况。

所以唯一没有出现的是第一个字符串,我希望返回整个字符串,但只有第一部分匹配。

所以我需要调整模式以包含所有内容,除非字符串中包含“干货”一词,如果是这样,则只返回“结帐”和“上午”或“下午”这两个词之间的部分。

标签: regexexcelvbaregex-negationregex-lookarounds

解决方案


根据您的展示和描述,我认为这可能会做到:

\bCHECKOUT.*?(?=\s*DRY GOODS|$)

这将从您的数据中返回:

CHECKOUT Senior Guest Services Manager FRONTENDMGR: 07:00 AM - 08:30 AM SGSM_BOOKKEEPING: 08:30 AM - 01:00 PM FRONTENDMGR: 01:00 PM - 04:00 PM
CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM
CHECKOUT Guest Services Manager BOOKKEEPER: 09:00 AM - 01:00 PM

我们匹配CHECKOUT,然后其他所有内容(但不包括)DRY GOODS。如果我们没有找到DRY GOODS,我们继续到字符串的末尾。

如果字符串超过多行,可能需要替换.*?[\s\S]*?

如果您的数据是这样的,您绝对必须AM|PM在最后匹配,然后尝试:

\bCHECKOUT.*(?:AM|PM)(?=.*?DRY GOODS|$)

推荐阅读