我正在尝试为一系列值添加特殊字符。但我不知道如何。
以下是原始输入:
mAPIService = ApiUtils.getAPIService();
mAPIService.savePost(category).enqueue(new Callback<List<DataStored>>() {
@Override
public void onResponse(Call<List<DataStored>> call, Response<List<DataStored>> response) {
dataStored= response.body();
myRecyclerAdapter.addItems(dataStored);
}
@Override
public void onFailure(Call<List<DataStored>> call, Throwable t) {
}
});
我想要:
chemical <- "200mL of Ac2O3, 3.5mml of AgBF4, 10.0ml of AgBr, 100ml of AgCl3Cu2"
基本上,我在原始数据中的化学式中有一个数字之前和之后添加“〜”。
我试图使用gsub,但我不确定如何告诉R在化学式中找到那些数字然后插入。
有没有人想过这个?谢谢!
答案 0 :(得分:4)
gsub("(?<=[A-Za-z])([0-9])","~\\1~",chemical,perl = T)
[1] "200mL of Ac~2~O~3~, 3.5mml of AgBF~4~, 10.0ml of AgBr, 100ml of AgCl~3~Cu~2~"
在这里,您需要使用正面回顾语法?<=
来指定您希望数字前面有字母,大写或小写[A-z]
。您可以使用数字括号来创建一个捕获组,使用\1
进行调用,并使用\
替换为~\\1~
。 perl = T
允许使用正面回顾语法
答案 1 :(得分:2)
与@denis类似,但不使用perl语法:
gsub("([A-Za-z])([0-9]+)","\\1~\\2~",chemical)
(根据@Wiktor正确评论更正)
答案 2 :(得分:2)
这成功了。是否会从更多变的情况下提供可能是一个问题:
gsub("([^ [:digit:].])([[:digit:]])", "\\1~\\2~", chemical)
#[1] "200mL of Ac~2~O~3~, 3.5mml of AgBF~4~, 10.0ml of AgBr, 100ml of AgCl~3~Cu~2~"
逻辑是匹配一个{非数字,非空格,非小数点}字符的配对,后跟一个数字并放置一个波浪形的侧翼数字。如果“数字”的大小可能超过9,那么你可能希望在数字之后加上量化:“[[:digit:]] {1,30}”也许。
答案 3 :(得分:1)
选项是strsplit
上的space
,然后使用digits
替换character
开头的单词中的~\\1~
:
chemical <- "200mL of Ac2O3, 3.5mml of AgBF4, 10.0ml of AgBr, 100ml of AgCl3Cu2"
a <- strsplit(chemical, split = " ")[[1]]
paste0(ifelse(grepl("^[a-zA-Z].*", a),gsub("(\\d)","~\\1~", a),a),collapse = " ")
#[1] "200mL of Ac~2~O~3~, 3.5mml of AgBF~4~, 10.0ml of AgBr, 100ml of AgCl~3~Cu~2~"