首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于匹配除特定单词以外的字符串的RegEx

用于匹配除特定单词以外的字符串的RegEx
EN

Stack Overflow用户
提问于 2019-05-23 15:23:47
回答 2查看 345关注 0票数 1

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

代码语言:javascript
运行
复制
pattern = (CHECKOUT[a-zA-Z_(/ ):]+\w+:\w+\s((AM|PM)|(am|pm))\s\-\s\w+:\w+\s((AM|PM)|(am|pm)))

输入的字符串是:

代码语言:javascript
运行
复制
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

对于第一个字符串,我希望返回整个字符串,但只返回以下内容:签出高级来宾服务经理FRONTENDMGR: 07:00上午- 08:30

对于第二个字符串,我只希望返回从“签出”到"01:00 PM“的字符串的第一部分,这很好。

使用第三个字符串时,我只希望返回“签出”到"01:00 PM“之间的部分,这将发生。

所以唯一没有发生的是第一个字符串,在这里,我希望返回整个字符串,但只希望第一部分匹配。

因此,我需要调整模式,以包括一切,除非单词“干货”在字符串中,如果是的话,只返回“结账”和"AM“或"PM”之间的部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 16:40:24

从你的表现和你的描述来看,我认为这可能会做到:

代码语言:javascript
运行
复制
\bCHECKOUT.*?(?=\s*DRY GOODS|$)

从你的数据来看:

代码语言:javascript
运行
复制
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的,那么请尝试:

代码语言:javascript
运行
复制
\bCHECKOUT.*(?:AM|PM)(?=.*?DRY GOODS|$)
票数 0
EN

Stack Overflow用户

发布于 2019-05-23 15:58:44

您可能会更新您的模式,以便在匹配之后使用负前瞻性(?!来断言右边的内容不包含DRY GOOD

代码语言:javascript
运行
复制
\bCHECKOUT[a-zA-Z_(/ ):]+\w+:\w+\s(?:[AP]M|[ap]m)\s-\s\w+:\w+\s(?:[AP]M|[ap]m)(?!.*\bDRY GOODS\b).*

解释

  • \bCHECKOUT字面上匹配一个单词边界,以防止该单词成为较大单词的一部分。
  • [a-zA-Z_(/ ):]+匹配1+乘以字符类中列出的任何一个
  • \w+:\w+\s匹配1+单词字符,然后匹配:,然后再匹配1+单词字符,然后是空格字符。
  • (?:[AP]M|[ap]m)匹配上午上午或下午
  • \s-\s\w+:\w+\s匹配一系列空格字符、-:和word字符。
  • (?:[AP]M|[ap]m)匹配上午上午或下午
  • (?!.*\bDRY GOODS\b)断言右边的内容不包含单词边界之间的干货。
  • .*匹配任何字符0+时间

Regex演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56278474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档