假设我有一长串文本,比如一个段落或更多,并且有一个经常出现的特定单词,我们称其为 KEY。
我想在每个 KEY 之后的单词后面插入一个“\n”。
所以,如果我有字符串KEY Hello this is KEY an example
。我希望它看起来像KEY Hello\n这是 KEY an\n示例
如果任务稍微简单一些,并且我只想在 KEY 之后添加\n,那么我可以使用 gsub("KEY","KEY\n",string) 轻松做到这一点
,但我不认为正则表达式有一种优雅的方式在匹配后选择单词,即使它确实如此,我也不确定是否可以在 gsub
中使用它。
在我想要的位置添加\n 的好方法是什么?
最佳答案
您可以使用捕获组并引用它。正如 Wiktor Stribiżew 指出的那样,你必须决定如何处理某些场景和具体情况。
对于所提供的示例,查找 KEY 后跟一个空格,后跟非空白字符 1 次或多次 (\\S+
),后跟一个空格:
gsub("(KEY \\S+ )", "\\1\n", string, perl = TRUE)
如果您想更通用地了解“KEY”后面的内容,那么您可以添加一个字符类,包括您允许的内容(或\s 表示任何空白字符,或\W 表示任何非字母数字/下划线字符,正如维克托指出的那样)。像这样的事情:
gsub("(KEY[., ;!?]\\S+ )", "\\1\n", string, perl = TRUE)
gsub("(KEY\\s\\S+ )", "\\1\n", string, perl = TRUE)
gsub("(KEY\\W+\\S+ )", "\\1\n", string, perl = TRUE)
在字符类部分中放置您想要的任何标点符号[., ;!?]
Wiktor 的变体可能更强大一点:
gsub("(KEY\\s+\\S+\\s*)", "\\1\n", string) # \s = white-space character
# \S = non-white-space character
gsub("(KEY\\W+\\w+\\s*)", "\\1\n", string) # \w for alphanumeric/underscore
# \W for the opposite of \w.
这些变体不需要在下一个单词后有空格(\\s*
表示 0 个或多个空白字符),并且它们可以匹配 KEY 之后的一个或多个空白字符或一个或KEY 之后有更多非字母数字/下划线。
关于regex - 在正则表达式匹配后的单词后面插入\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38624061/