Assuming the quotes are correctly balanced and there are no escaped quotes, then it's easy:
result = subject.gsub(/a(?=(?:[^"]*"[^"]*")*[^"]*)/, '')
This replaces all the a
s with the empty string if and only if there is an even number of quotes ahead of the matched a
.
Explanation:
a # Match a
(?= # only if it's followed by...
(?: # ...the following:
[^"]*" # any number of non-quotes, followed by one quote
[^"]*" # the same again, ensuring an even number
)* # any number of times (0, 2, 4 etc. quotes)
[^"]* # followed by only non-quotes until
# the end of the string.
) # End of lookahead assertion
If you can have escaped quotes within quotes (a "length: 2""
), it's still possible but will be more complicated:
result = subject.gsub(/a(?=(?:(?:\.|[^"\])*"(?:\.|[^"\])*")*(?:\.|[^"\])*)/, '')
This is in essence the same regex as above, only substituting (?:\.|[^"\])
for [^"]
:
(?: # Match either...
\. # an escaped character
| # or
[^"\] # any character except backslash or quote
) # End of alternation
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…