Blaubart: undefined als Ergebnis in RegExp

Tach.

Folgendes Minimalbeispiel für einen RegExp in Javascript:

  
var s = "watt soll 'n ditt";  
var pattern = /^(watt)( soll)? ('n ditt)$/;  
var matches = pattern.exec(s);  

Als Ergebnis erhalte ich erwartungsgemäß ["watt soll 'n ditt", "watt", " soll", "'n ditt"].

Überhaupt nicht erwartungsgemäß ist jedoch das Ergebnis für die Zeichenkette "watt 'n ditt". Ich erhalte ["watt 'n ditt", "watt", undefined, "'n ditt"].

Was hat "undefined" im Ergebnis zu suchen? Wenn für den optionalen Teilausdruck nur der Quantifier "keinmal" greift, erwarte ich, daß im Ergebnisarray auch bloß ein leerer String dafür auftaucht – nichts Undefiniertes. Ein nachfolgender Test mit PHPs preg_match() brachte genau dieses Ergebnis. Ich habe keinen Hinweis darauf gefunden, daß RegExps in Javascript an dieser Stelle mit "undefined" antworten sollen. Opera und Firefox scheinen sich hier aber einig zu sein, denn beide liefern "undefined". Der IE 5 hingegen liefert das von mir erwartete Ergebnis, was mich natürlich sofort mißtrauisch macht. ;)

Was läuft hier verkehrt?

--
Once is a mistake, twice is Jazz.
  1. Hallo,

    Was hat "undefined" im Ergebnis zu suchen?

    Das ist offenbar so definiert. Ich finde nicht die genaue Stelle, aber in ECMAScript gibt es ein Beispiel für den |-Operator:

    »Any capturing parentheses inside a portion of the pattern skipped by | produce undefined values instead of strings. Thus, for example,

    /a|ab/.exec("abc")

    returns the result "a" and not "ab". Moreover,

    /( (a)|(ab) ) ( (c)|(bc) )/.exec("abc")

    returns the array

    [
    "abc",
     "a",
      "a",
      undefined,
     "bc",
      undefined,
      "bc"
    ]

    (...)«

    Woanders:

    »/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
    which returns the array
    [
    "zaacbbbcac",
     "z",
     "ac",
      "a",
      undefined,
      "c"

    (Einrückungen und Leerraum von mir entsprechend der Klammerung.)

    Wenn für den optionalen Teilausdruck nur der Quantifier "keinmal" greift, erwarte ich, daß im Ergebnisarray auch bloß ein leerer String dafür auftaucht – nichts Undefiniertes.

    Ein leerer String ist ungeeignet, weil damit gesagt wäre, dass das Pattern einen leeren String gefunden hätte, was etwas anderes ist als dass es gar nicht gepasst hat. Ich hätte eher null erwartet, das wäre der sinnigste Wert. Aber was sollen wir darüber streiten, es ist nunmal so im Standard festgelegt.

    Mathias

    1. Tach.

      Was hat "undefined" im Ergebnis zu suchen?

      Das ist offenbar so definiert. Ich finde nicht die genaue Stelle, aber in ECMAScript gibt es ein Beispiel für den |-Operator: [...]

      Ah, anscheinend wirklich "by design". Vielen Dank für den Link.

      Wenn für den optionalen Teilausdruck nur der Quantifier "keinmal" greift, erwarte ich, daß im Ergebnisarray auch bloß ein leerer String dafür auftaucht – nichts Undefiniertes.

      Ein leerer String ist ungeeignet, weil damit gesagt wäre, dass das Pattern einen leeren String gefunden hätte, was etwas anderes ist als dass es gar nicht gepasst hat. Ich hätte eher null erwartet, das wäre der sinnigste Wert.

      Er *paßt* ja (der Ausdruck verlangt "eins oder keins"), liefert nur eben keine Zeichen. Nun gut, die Macher haben sich bei der Standardisierung halt für eine dritte Variante entschieden ...

      --
      Once is a mistake, twice is Jazz.