我正在尝试使用正则表达式将小数添加到字符串向量中美元符号后面的任何数字。到目前为止,我已经取得了部分成功,但在处理出现在字符串末尾的实例时遇到了麻烦。这是问题的示例:
ex <- tibble(strings = c("10/$20/$30", "$40/50/60", "$70.00/80/$90.00"))
gsub("(\\$[0-9]+)([^\\.])", "\\1\\.00\\2", ex$strings)
我认为这意味着,识别以美元符号和至少一位数字开头但后面没有句点的子字符串,并将它们替换为美元符号和当前数字,然后是小数点和两位零...但是产生:
[1] "10/$20.00/$3.000" "$40.00/50/60" "$7.000.00/80/$9.000.00"
我看到它为所有不位于字符串末尾的美元值返回了所需的结果,但正如第一个和第三个字符串所证明的那样,很明显我仍然缺少一种成分。
似乎我有两个问题,第一个是匹配字符串末尾的字符串 ($30),另一个是已经有小数的美元值。
最佳答案
以下逻辑似乎可行:
x <- c("10/$20/$30", "$40/50/60", "$70.00/80/$90.00")
gsub("(\\$\\d+)(?![^/])", "\\1.00", x, perl=TRUE)
[1] "10/$20.00/$30.00" "$40.00/50/60" "$70.00/80/$90.00"
这里是正则表达式模式的解释:
(\\$\\d+) match and capture '$' followed by one or more digits
(?![^/]) which is also followed by either '/' or the end of the input
然后我们替换为捕获的数量,后跟 .00
。请注意,负先行 (?![^/])
排除了已经具有小数部分的输入。
关于R 正则表达式 : modifying digits of varying lengths at end of string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63963919/