C#
string resultString = null;
Regex outerRegex = new Regex("<[^<>]*>");
Regex innerRegex = new Regex("\"([^\"]*)\"");
// Odnajdujemy pierwsz sekcj.
int lastIndex = 0;
Match outerMatch = outerRegex.Match(subjectString);
while (outerMatch.Success) {
    // Wykonujemy operacj przeszukiwania i zastpowania na tekcie pomidzy
    // biecym a poprzednim dopasowaniem.
    string textBetween =
        subjectString.Substring(lastIndex, outerMatch.Index - lastIndex);
    resultString = resultString +
        innerRegex.Replace(textBetween, "\u201E$1\u201D");
    lastIndex = outerMatch.Index + outerMatch.Length;
    // Tekst z tej sekcji kopiujemy w niezmienionej formie.
    resultString = resultString + outerMatch.Value;
    // Odnajdujemy nastpn sekcj.
    outerMatch = outerMatch.NextMatch();
}
// Wykonujemy operacj przeszukiwania i zastpowania na pozostaym tekcie (za ostatnim dopasowaniem).
string textAfter = subjectString.Substring(lastIndex,
                   subjectString.Length - lastIndex);
resultString = resultString + innerRegex.Replace(textAfter,
                                                   "\u201E$1\u201D");


VB.NET
Dim ResultString As String = Nothing
Dim OuterRegex As New Regex("<[^<>]*>")
Dim InnerRegex As New Regex("""([^""]*)""")
'Odnajdujemy pierwsz sekcj.
Dim LastIndex = 0
Dim OuterMatch = OuterRegex.Match(SubjectString)
While OuterMatch.Success
    'Wykonujemy operacj przeszukiwania i zastpowania na tekcie pomidzy
    'biecym a poprzednim dopasowaniem.
    Dim TextBetween = SubjectString.Substring(LastIndex,
                      OuterMatch.Index - LastIndex);
    ResultString = ResultString + InnerRegex.Replace(TextBetween,
                   ChrW(&H201E) + "$1" + ChrW(&H201D))
    LastIndex = OuterMatch.Index + OuterMatch.Length
    'Tekst z tej sekcji kopiujemy w niezmienionej formie.
    ResultString = ResultString + OuterMatch.Value
    'Odnajdujemy nastpn sekcj.
    OuterMatch = OuterMatch.NextMatch
End While
'Wykonujemy operacj przeszukiwania i zastpowania na pozostaym tekcie (za ostatnim dopasowaniem).
Dim TextAfter = SubjectString.Substring(LastIndex,
                                        SubjectString.Length - LastIndex);
ResultString = ResultString +
    InnerRegex.Replace(TextAfter, ChrW(&H201E) + "$1" + ChrW(&H201D))


Java
StringBuffer resultString = new StringBuffer();
Pattern outerRegex = Pattern.compile("<[^<>]*>");
Pattern innerRegex = Pattern.compile("\"([^\"]*)\"");
Matcher outerMatcher = outerRegex.matcher(subjectString);
int lastIndex = 0;
while (outerMatcher.find()) {
    // Wykonujemy operacj przeszukiwania i zastpowania na tekcie pomidzy
    // biecym a poprzednim dopasowaniem.
    String textBetween = subjectString.substring(lastIndex,
                                                 outerMatcher.start());
    Matcher innerMatcher = innerRegex.matcher(textBetween);
    resultString.append(innerMatcher.replaceAll("\u201E$1\u201D"));
    lastIndex = outerMatcher.end();
    // Dopisujemy dopasowanie do wyraenia regularnego w niezmienionej formie.
    resultString.append(outerMatcher.group());
}
// Wykonujemy operacj przeszukiwania i zastpowania na pozostaym tekcie (za ostatnim dopasowaniem).
String textAfter = subjectString.substring(lastIndex);
Matcher innerMatcher = innerRegex.matcher(textAfter);
resultString.append(innerMatcher.replaceAll("\u201E$1\u201D"));


JavaScript
var result = "";
var outerRegex = /<[^<>]*>/g;
var innerRegex = /"([^"]*)"/g;
var outerMatch = null;
var lastIndex = 0;
while (outerMatch = outerRegex.exec(subject)) {
    if (outerMatch.index == outerRegex.lastIndex) outerRegex.lastIndex++;
    // Wykonujemy operacj przeszukiwania i zastpowania na tekcie pomidzy
    // biecym a poprzednim dopasowaniem.
    var textBetween = subject.substring(lastIndex, outerMatch.index);
    result = result + textBetween.replace(innerRegex, "\u201E$1\u201D");
    lastIndex = outerMatch.index + outerMatch[0].length;
    // Dopisujemy dopasowanie do wyraenia regularnego w niezmienionej formie.
    result = result + outerMatch[0];
}
// Wykonujemy operacj przeszukiwania i zastpowania na pozostaym tekcie (za ostatnim dopasowaniem).
var textAfter = subject.substr(lastIndex);
result = result + textAfter.replace(innerRegex, "\u201E$1\u201D");


PHP
$result = '';
$lastindex = 0;
while (preg_match('/<[^<>]*>/', $subject, $groups, PREG_OFFSET_CAPTURE,
         $lastindex)) {
    $matchstart = $groups[0][1];
    $matchlength = strlen($groups[0][0]);
    // Wykonujemy operacj przeszukiwania i zastpowania na tekcie pomidzy
    // biecym a poprzednim dopasowaniem.
    $textbetween = substr($subject, $lastindex, $matchstart-$lastindex);
    $result .= preg_replace('/"([^"]*)"/', '$1', $textbetween);
    // Dopisujemy dopasowanie do wyraenia regularnego w niezmienionej formie.
    $result .= $groups[0][0];
    // Przechodzimy do pozycji pocztkowej nastpnego dopasowania.
    $lastindex = $matchstart + $matchlength;
    if ($matchlength == 0) {
        // W ten sposb unikamy wejcia w ptl nieskoczon w razie
        // wystpowania dopasowa zerowej dugoci.
        $lastindex++;
    }
}
// Wykonujemy operacj przeszukiwania i zastpowania na pozostaym tekcie (za ostatnim dopasowaniem).
$textafter = substr($subject, $lastindex);
$result .= preg_replace('/"([^"]*)"/', '$1', $textafter);


Perl
use encoding "utf-8";
$result = '';
while ($subject =~ m/<[^<>]*>/g) {
    $match = $&;
    $textafter = $';
    ($textbetween = $`) =~ s/"([^"]*)"/\x{201E}$1\x{201D}/g;
    $result .= $textbetween . $match;
}
$textafter =~ s/"([^"]*)"/\x{201E}$1\x{201D}/g;
$result .= $textafter;


Python
innerre = re.compile('"([^"]*)"')
result = "";
lastindex = 0;
for outermatch in re.finditer("<[^<>]*>", subject):
    # Wykonujemy operacj przeszukiwania i zastpowania na tekcie pomidzy
    # biecym a poprzednim dopasowaniem.
    textbetween = subject[lastindex:outermatch.start()]
    result += innerre.sub(u"\u201E\\1\u201D", textbetween)
    lastindex = outermatch.end()
    # Dopisujemy dopasowanie do wyraenia regularnego w niezmienionej formie.
    result += outermatch.group()
# Wykonujemy operacj przeszukiwania i zastpowania na pozostaym tekcie (za ostatnim dopasowaniem).
textafter = subject[lastindex:]
result += innerre.sub(u"\u201E\\1\u201D", textafter)


Ruby
result = '';
textafter = ''
subject.scan(/<[^<>]*>/) {|match|
    textafter = $'
    textbetween = $`.gsub(/"([^"]*)"/, '\1')
    result += textbetween + match
}
result += textafter.gsub(/"([^"]*)"/, '\1')
