'R: Match an odd number of repetitions
I would like to match a string like \code, but not when the backslash is escaped.
I think that one way of doing this could be matching an odd number of backslashes. Then for example, assuming \code is an expression to be replaced by 1234:
\code would be 1234, but \\code, should stay as is, \\\code would be \\1234, etc.
In R, given the strings:
message(o <- "\\\\\\code")
# \\\code
message(e <- "\\\\code")
# \\code
A partially working attempt in R is:
message(gsub("((?:\\\\{2})?)\\\\code", "\\11234", o, perl=TRUE))
# \\1234
message(gsub("((?:\\\\{2})*)\\\\code", "\\11234", e, perl=TRUE))
# \1234
The regex matches both the odd and even case. To make it work, I should find a way to match the double backslashes, "\", more greedily (always when they are present) so that the second backslash doesn't.
Of course, if there is a better strategy to match a "\sequence" (when not escaped) that would be equally fine.
Solution 1:[1]
You may use
rx <- "(?<!\\\\)(?:\\\\{2})*\\K\\\\code"
Replace with 1234. See the regex demo.
Details
(?<!\\)- fail if there is a\immediately to the left of the current location(?:\\{2})*- match and consume 0 or more occurrences of double backslash\K- match reset operator that discards all text matched so far\\code-\codetext.
See an R demo online:
rx <- "(?<!\\\\)(?:\\\\{2})*\\K\\\\code"
message(gsub(rx, "1234", "\\\\\\code", perl=TRUE)) # \\\code
# => \\1234
message(gsub(rx, "1234", "\\\\code", perl=TRUE)) # \\code
# => \\code
message(gsub(rx, "1234", "\\code", perl=TRUE)) # \code
# => 1234
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
