gpt4 book ai didi

正则表达式匹配子字符串,除非另一个子字符串匹配

转载 作者:行者123 更新时间:2023-12-04 17:17:32 25 4
gpt4 key购买 nike

我正在尝试更深入地研究正则表达式并希望匹配条件,除非在同一字符串中也找到了某些子字符串。我知道我可以用两个 grepl语句(如下所示)但我想使用单个正则表达式来测试这种情况,因为我正在插入我的理解。假设我想使用 "(dog.*man|man.*dog)" 匹配单词“dog”和“man” ( taken from here ) 但如果字符串包含子字符串“park”,则不会。我想我可以使用 (*SKIP)(*FAIL)否定“公园”,但这不会导致字符串失败(如下所示)。

  • 如何将查找“狗”和“人”而不是“公园”的逻辑与 1 个正则表达式相匹配?
  • 我对(*SKIP)(*FAIL)|的理解有什么问题?

  • 编码:
    x <- c(
    "The dog and the man play in the park.",
    "The man plays with the dog.",
    "That is the man's hat.",
    "Man I love that dog!",
    "I'm dog tired",
    "The dog park is no place for man.",
    "Park next to this dog's man."
    )

    # Could do this but want one regex
    grepl("(dog.*man|man.*dog)", x, ignore.case=TRUE) & !grepl("park", x, ignore.case=TRUE)

    # Thought this would work, it does not
    grepl("park(*SKIP)(*FAIL)|(dog.*man|man.*dog)", x, ignore.case=TRUE, perl=TRUE)

    最佳答案

    您可以使用 anchor 定前瞻解决方案(需要 Perl 风格的正则表达式):

    grepl("^(?!.*park)(?=.*dog.*man|.*man.*dog)", x, ignore.case=TRUE, perl=T)

    这是一个 IDEONE demo
  • ^ - 将模式 anchor 定在字符串的开头
  • (?!.*park) - 如果 park 匹配失败存在
  • (?=.*dog.*man|.*man.*dog) - 如果 man 匹配失败和 dog缺席。

  • 另一个版本(更具可扩展性)具有 3 个前瞻:
    ^(?!.*park)(?=.*dog)(?=.*man)

    关于正则表达式匹配子字符串,除非另一个子字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32747887/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com