Replace string unless between two points
r, regex
Solution
Using the strsplit method of @FrankieTheKneeMan:
x <- c("I like \\the big\\ red \\dog\\ $\\hat + \\bar$, here it is $\\bar{x}$",
"I have $50 to \\spend\\",
"$\\frac{4}{5}$ is nice",
"$\\30\\ is nice too")
# > cat(x, sep='\n')
# I like \the big\ red \dog\ $\hat + \bar$, here it is $\bar{x}$
# I have $50 to \spend\
# $\frac{4}{5}$ is nice
# $\30\ is nice too
# split into parts separated by '$'.
# Add a space at the end of every string to deal with '$'
# at the end of the string (as
# strsplit('a$', '$', fixed=T)
# is just 'a' in R)
bits <- strsplit(paste(x, ''), '$', fixed=T)
# apply the regex to every second part (starting with the first)
# and always to the last bit (because of the ' ' we added)
out <- sapply(bits, function (x) {
idx <- unique(c(seq(1, length(x), by=2), length(x)))
x[idx] <- gsub('\\', '\"', x[idx], fixed=T)
# join back together
x <- paste(x, collapse='$')
# remove that last ' ' we added
substring(x, 1, nchar(x) - 1)
}, USE.NAMES=F)
# > cat(out, sep='\n')
# I like "the big" red "dog" $\hat + \bar$, here it is $\bar{x}$
# I have $50 to "spend"
# $\frac{4}{5}$ is nice
# $"30" is nice too
This will always have cases in which it fails (`"I have $20. \\hi\\ Now I have $30"`), so you will have to keep that in mind and test it against other strings of the format you are expecting.
Problem
I have the regex need to replace all backslashes `\\` with `\"` unless the `\\` is between two dollar signs `$\\bar{x}$`. I don't know how to say in regex replace all these unless it falls between these two characters. Here's a string and a `gsub` that gets rid og all `\\` even inside double dollars ``` x <- c("I like \\the big\\ red \\dog\\ $\\hat + \\bar$, here it is $\\bar{x}$", "I have $50 to \\spend\\", "$\\frac{4}{5}$ is nice", "$\\30\\ is nice too") gsub("\\\\", "\"", x) ## > gsub("\\\\", "\"", x) ## [1] "I like \"the big\" red \"dog\" $\"hat + \"bar$, here it is $\"bar{x}$" ## [2] "I have $50 to \"spend\"" ## [3] "$\"frac{4}{5}$ is nice" ## [4] "$\"30\" is nice too" ``` What I am after is: ``` ## [1] "I like \"the big\" red \"dog\" $\\hat + \\bar$, here it is $\\bar{x}$" ## [2] "I have $50 to \"spend\"" ## [3] "$\\frac{4}{5}$ is nice" ## [4] "$\"30\" is nice too" ```