【问题标题】:Replace non-duplicate character in string替换字符串中的非重复字符
【发布时间】:2019-09-11 00:39:58
【问题描述】:

您好,我想用空格替换正斜杠,但前提是它出现一次。

 str_replace_all( 'NOOOOO//ABCDEFGHI/asdfasd//sdkksksks', "/(?!=/)", " ")

我希望输出为:NOOOOO//ABCDEFGHI asdfasd//sdkksksks

【问题讨论】:

    标签: r regex regex-lookarounds


    【解决方案1】:

    使用sub 尝试以下选项:

    input <- "NOOOOO//ABCDEFGHI/asdfasd//sdkksksks"
    gsub("(?<!/)/(?!/)", " ", input, perl=TRUE)
    
    [1] "NOOOOO//ABCDEFGHI asdfasd//sdkksksks"
    

    这里的策略是使用模式(?&lt;!/)/(?!/),它匹配一个正斜杠,它在两边都被另一个正斜杠以外的任何东西包围。

    【讨论】:

    • 所以“不是斜线”可以在正则表达式 !/[^/] 中以两种方式表示?前一个 perl 是特定的吗?
    • @RonakShah 我会说!/ 是消极后视的一部分,即(?&lt;!text) 是积极后视(?&lt;=text) 的否定。
    • @RonakShah Only [^/] 本身的意思是“不是斜线”。 !/ 仅在作为环视的一部分时才有意义,例如(?!/) 表示“后面的不是斜线。”
    • @RonakShah 它们完全不同的外观是零长度匹配它们不使用单词,而字符类确实使用单词,[^/] 表示匹配任何不是/ 的东西,等等另一方面some pattern(?!) 表示some pattern 后面不能跟/
    【解决方案2】:

    您可以使用(*SKIP)(*FAIL)sub 以及perl=TRUE 选项来匹配不应成为匹配部分的字符,而不是使用环视。

    在这种情况下,您可以匹配 2 个或更多不应包含在匹配项中的正斜杠。之后,匹配单个正斜杠以替换为空格。

    /{2,}(*SKIP)(*F)|/
    

    Regex demo | R demo

    例如

    s <- "NOOOOO//ABCDEFGHI/asdfasd//sdkksksks"
    gsub("/{2,}(*SKIP)(*F)|/", " ", s, perl=TRUE)
    

    输出

    [1] "NOOOOO//ABCDEFGHI asdfasd//sdkksksks"
    

    【讨论】:

    • 哇!谢谢 - 我什至不知道跳过/失败。我一直在考虑环视方法,但肯定会开始使用这种结构。
    【解决方案3】:

    另一种方法是使用捕获组

     (^|[^\/\n])\/([^\/\n]|$)
    

    比替换为\1 \2

    Regex Demo

    【讨论】:

    • 谢谢,我得到了这个使用:str_replace_all(input, "(^|[^/])/([^/]|$)", "\\1 \\2") .换行符很好,虽然在这种情况下与我无关,但我可以看到它通常会。
    猜你喜欢
    • 2011-10-10
    • 2021-06-17
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2022-01-07
    相关资源
    最近更新 更多