我试图将所有数字放在不包含负值的括号中,但使用单词边界似乎不起作用。
x <- '125 -110 55 25 135 -145 10 -199'
gsub('\\b(\\d+)', '(\\1)', x)
上面将所有数字放在括号中,单词边界似乎也与负数匹配。我该如何解决这个问题?
只有125
,55
,25
,135
,10
应放在括号中。
答案 0 :(得分:2)
原因是连字符被视为边界。你需要一个 Negative Lookbehind 。
x <- '125 -110 55 25 135 -145 10 -199'
gsub('(?<![\\d-])(\\d+)', '(\\1)', x, perl=T)
# [1] "(125) -110 (55) (25) (135) -145 (10) -199"
<强>解释强>:
(?<! # look behind to see if there is not:
[\d-] # any character of: digits (0-9), '-'
) # end of look-behind
答案 1 :(得分:2)
所以\b
不起作用?创造你自己的界限!
使用此:
grepl("(?<![-\\d])\\d\\d*", subject, perl=TRUE);
请参阅demo。
正则表达式(没有转义)是(?<![-\d])\d\d*
<强>解释强>
(?<![-\d])
断言前面的内容不是连字符或数字。从本质上讲,这是你的DIY界限。 :)\d
匹配第一个数字\d*
匹配任何尾随数字<强>参考强>
答案 2 :(得分:1)
strsplit
,因为我必须
> s <- strsplit(x, " ")[[1]]
> s[!grepl("\\-", s)] <- paste0("(", s[!grepl("\\-", s)], ")")
> paste(s, collapse = " ")
# [1] "(125) -110 (55) (25) (135) -145 (10) -199"