die Zitate Unter der Annahme, sind richtig ausgeglichen und es gibt keine Zitate entkommen, dann ist es einfach:
result = subject.gsub(/a(?=(?:[^"]*"[^"]*")*[^"]*\Z)/, '')
Dies ersetzt all a
s mit dem leeren String zurück, wenn und nur wenn es eine gerade Anzahl von ist zitiert vor der übereinstimmenden a
.
Erläuterung:
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
\Z # the end of the string.
) # End of lookahead assertion
Wenn Sie in Anführungszeichen entgangen Anführungszeichen (a "length: 2\""
) haben kann, ist es immer noch möglich, wird aber komplizierter sein:
result = subject.gsub(/a(?=(?:(?:\\.|[^"\\])*"(?:\\.|[^"\\])*")*(?:\\.|[^"\\])*\Z)/, '')
Dies ist im Wesentlichen die gleiche Regex wie oben, nur (?:\\.|[^"\\])
für [^"]
:
(?: # Match either...
\\. # an escaped character
| # or
[^"\\] # any character except backslash or quote
) # End of alternation
ersetzen
Ein Regex passt jeweils auf einen einzelnen Teilstring. Wie man einen Regex wiederholt, ist eine Eigenschaft der Hosting-Sprache. Welche Sprache verwendest du? – tripleee
@triplee Rubin. –