regex - 用于匹配除特定单词之外的字符串的正则表达式
问题描述
在 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”之间的部分并发生这种情况。
所以唯一没有出现的是第一个字符串,我希望返回整个字符串,但只有第一部分匹配。
所以我需要调整模式以包含所有内容,除非字符串中包含“干货”一词,如果是这样,则只返回“结帐”和“上午”或“下午”这两个词之间的部分。
解决方案
根据您的展示和描述,我认为这可能会做到:
\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|$)
推荐阅读
- ruby-on-rails - 按多对多表查询多对多关系过滤,但按关联表字段排序
- laravel - 请求阻止
- javascript - 如何在滚动时将 div 元素粘贴到其上方的 div 上?
- javascript - 数组元素的第一个参数中的对象类型 [1] 中缺少属性 top
- google-domains - 避免自定义域名重写 URL 到 Google 站点
- java - 我想使用 JavaSound 同时播放多个音频文件,但我的线程应用程序技能生疏了
- c++ - 我的字数 C++ 代码哪里出错了
- c++ - 使用 qt 从 postgres 读取和写入图像(大对象)
- node.js - 如何将表单内容发布到卡片组件
- c++ - 使用函数指针将 C 转换为 CPP