首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex替换匹配,但在引号中忽略匹配。

Regex替换匹配,但在引号中忽略匹配。
EN

Stack Overflow用户
提问于 2017-11-28 11:29:24
回答 3查看 64关注 0票数 3

在引号之外出现" and“或" or”或“to "&”和“,然后将其替换,除非在引号中出现。

引号可以是单引号(‘)或双引号(“)。

字符串如下:

代码语言:javascript
复制
Industry ='Education' or Industry =\"Energy\" or Industry = 'Financial or Bank' or Industry = 'Hospitality' or Industry = \"Food and Beverage\"  and Industry = 'Utilities'

预期产出:

代码语言:javascript
复制
Industry ='Education' | Industry =\"Energy\" | Industry = 'Financial or Bank' | Industry = 'Hospitality' | Industry = \"Food and Beverage\"  & Industry = 'Utilities'

我知道我们可能不得不使用围观,但不知道如何使用。在所有的正则表达式操作中,我都使用了stringr包。

如果你需要更多的信息,请告诉我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-28 11:49:47

您应该考虑一种匹配双引号和单引号子字符串的方法,以省略它们,并且只在所有其他上下文中处理andor。最简单的方法是使用gsubfn,在这里您可以传递一个PCRE正则表达式,该正则表达式正是这样做的:

代码语言:javascript
复制
> library(gsubfn)
> x <- "Industry ='Education' or Industry =\"Energy\" or Industry = 'Financial or Bank' or Industry = 'Hospitality' or Industry = \"Food and Beverage\"  and Industry = 'Utilities'"
> pat = "(?:\"[^\"]*\"|'[^']*')(*SKIP)(*F)|\\b(and|or)\\b"
> gsubfn(pat, ~ ifelse(z=="or","|", "&"), x, backref=0, perl=TRUE)
[1] "Industry ='Education' | Industry =\"Energy\" | Industry = 'Financial or Bank' | Industry = 'Hospitality' | Industry = \"Food and Beverage\"  & Industry = 'Utilities'"

(?:\"[^\"]*\"|'[^']*')(*SKIP)(*F)|\\b(and|or)\\b模式将匹配:

  • (?: -交替组:
    • \"[^\"]*\" -一个双引号子字符串,里面没有双引号
    • | -或
    • '[^']*' -一个单引号子字符串

  • ) -小组的末端
  • (*SKIP)(*F) -放弃比赛,继续寻找下一场比赛
  • | -或
  • \\b(and|or)\\b -第1组:andor作为一个整体。

regex演示

根据文本"'"..."'...'中转义的方式,您需要调整正则表达式的(?:\"[^\"]*\"|'[^']*')部分。

~ ifelse(z=="or","|", "&")部分是一个回调函数,它接收唯一的参数(在此函数中名为z ),其内容是从正则表达式中获得的匹配值(即orand)。如果匹配值等于or,则将匹配替换为|、else和&

票数 4
EN

Stack Overflow用户

发布于 2017-11-28 11:37:49

这是一种丑陋的方法,但它适用于您的具体情况:

用于或:

代码语言:javascript
复制
(?:'|")(?:.*?)(?:'|")(?:.*?)(or)(?:.*?)

用于和:

代码语言:javascript
复制
(?:'|")(?:.*?)(?:'|")(?:.*?)(and)(?:.*?)

我建议使用https://regex101.com/帮助构建和测试regex。

票数 0
EN

Stack Overflow用户

发布于 2017-11-28 11:38:55

您的问题存在潜在的问题,因为嵌套的内容可能无法很好地处理,或者完全不能由单个正则表达式处理。尽管如此,如果我们假设您想要用管道替换的or值总是发生在引用字符串之后,那么我们可以尝试如下:

代码语言:javascript
复制
gsub("([\"'])\\s*or", "\\1 |", input)
[1] "Industry ='Education' | Industry =\"Energy\" | Industry = 'Financial or Bank' |
Industry = 'Hospitality' | Industry = \"Food and Beverage\"  and Industry = 'Utilities'"

通过检查,在引号字符串中出现的or值在两边被未引用的单词包围。显然,在看到其他数据或更多嵌套的内容时,可能会出现这种情况。

演示

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

https://stackoverflow.com/questions/47530467

复制
相关文章

相似问题

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