虽然Replace two dots in a string with gsub回答了有关替换“。”等标点字符的问题,但它似乎不适用于字边界。例如,
text100 <- "My # is 1234"
text1 <- gsub("\\b#\\b","hash",text100)
> text1
[1] "My # is 1234"
#
未被替换。如何解决这个问题?
请注意,不应替换多个#。例如,
'##'不应该替换为'hash'或'hashhash'。
#后面或前面跟任何图形字符都应该 不被替换(例如,'。#'不应该被替换)
答案 0 :(得分:5)
你的正则表达式不起作用,因为哈希不是一个单词字符,你需要一个单词字符在哈希的两边。
如果您想确保#
符号周围没有单词字符,请使用Perl样式的正则表达式替换:
text100 <- "My # is 1234"
gsub("(?<!\\w)\\#+(?!\\w)","hash",text100, perl=T)
请参阅IDEONE demo
后视(?<!\\w)
确保#
之前没有字母,数字或下划线,(?!\\w)
前瞻确保后面没有字母,数字或下划线它
为避免过度捕获,您可以将哈希放入字符类:
"(?<!\\w)[#]+(?!\\w)"
在哈希符号后使用+
量词将确保多个连续哈希值被替换为一个词&#34;哈希&#34;。
<强>更新强>
为您更新的示例调整工作的解决方案:
gsub("(?<!\\w|#)[#](?!\\w|#)", "hash", text100, perl=T)
在这里,(?<!\\w|#)
将确保散列前面没有单词字符或散列符号,(?!\\w|#)
否定前瞻将确保后面没有单词字符或散列符号哈希符号。
请参阅another demo