【问题标题】:Replace substring every >n characters (conditionally insert linebreaks for spaces)每隔 >n 个字符替换子字符串(有条件地为空格插入换行符)
【发布时间】:2016-12-12 13:52:25
【问题描述】:

我想在 R 中相当长的字符向量中用换行符 (\n) 替换空格。但是,我不想替换 每个 空格,但前提是子字符串执行完毕一定数量的字符 (n)。

例子:

mystring <- "this string is annoyingly long and therefore I would like to insert linebreaks" 

现在我想在每个空格的mystring 中插入换行符,条件是每个子字符串的长度大于 20 个字符 (nchar &gt; 20)。

因此,生成的字符串应该如下所示:

"this string is annoyingly\nlong and therefore I would\nlike to insert linebreaks") 

在 25、26 和 25 个字符之后插入换行符 (\n)。

我怎样才能做到这一点? 也许结合了gsubstrsplit

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    您可以使用.{21,}?\s 正则表达式匹配任意 21 个(自 nchar &gt; 20 起)或更多字符,但尽可能少,直到最近的空格:

    > gsub("(.{21,}?)\\s", "\\1\n", mystring)
    [1] "this string is annoyingly\nlong and therefore I would\nlike to insert linebreaks"
    

    详情

    • (.{21,}?) - 第 1 组捕获任何 21 个或更多字符,但尽可能少(因为 {21,}? 是一个 惰性 量词)
    • \\s - 一个空格

    替换包含对第 1 组的反向引用,以在空格之前重新插入文本,以及换行符(如果需要,也可以随意添加 CR)。

    【讨论】:

    • 这里为什么需要逗号和问号?我相信它将 21 个字符匹配到空格,从而消除对逗号的需要。我不明白问号的作用是什么。
    • @jtr13 答案中对此进行了解释:任意 21 个字符或更多,但尽可能少(因为 {21,}? 是一个惰性量词){21,}? 匹配超过 21 个,但尽可能少,也就是说,.{21,}? 将抓取任何 21 个字符,然后是第一个空格之前的任何字符。
    • 对,但我要问的是为什么你需要“或更多”......你不能做.{21}\s并完全匹配空格之前的21个字符吗?
    • @jtr13 如果您愿意,可以使用.{21}\s。 OP 有一个不同的问题。
    猜你喜欢
    • 2014-10-16
    • 2020-12-19
    • 2017-12-06
    • 2015-08-21
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多