Mr. Horse: RegExp-Objekt, exec und der Safari (Mac)

Hallo,

ich setze einen recht einfachen regulären Ausdruck mehrfach in einem Script ein und habe ihn daher einer Variablen zugewiesen.
Leider scheint der Safari unter Mac OS X damit ein Problem zu haben.
Gelernt habe ich bereits, daß ich exec() verwenden muß, damit auch der Mac-Safari auf die Subpatterns (RegExp.$n) zugreifen kann.
Aber nun verhält er sich beim zweiten Gebrauch des RegExp-Objekts so, als müsse das Objekt erst neu "initialisiert" oder "zurückgesetzt" werden.

Kennt Ihr dieses Phänomen?

Hier der Code:
var regexpIdFragment = new RegExp('\?(' + settings.idPrefixContentFragments + '-\d+)', 'g');
//...
if(regexpIdFragment.exec(urlInitial)) {
   idCurrentFragment = RegExp.$1;
}
//...
if(regexpIdFragment.exec(urlCurrent)) {
   idCurrentFragment = RegExp.$1;
}
//...
In dieser Version liefert exec() beim zweiten Mal im Mac-Safari null, so daß der zwiete if-Block übergangen wird.

Das hier dagegen klappt auch im Mac-Safari:
var regexpIdFragment = new RegExp('\?(' + settings.idPrefixContentFragments + '-\d+)', 'g');
//...
if(regexpIdFragment.exec(urlInitial)) {
   idCurrentFragment = RegExp.$1;
}
//...
regexpIdFragment.exec(urlCurrent)
if(regexpIdFragment.exec(urlCurrent)) {
   idCurrentFragment = RegExp.$1;
}
//...

Ebenso wie dies hier:
var regexpIdFragment = new RegExp('\?(' + settings.idPrefixContentFragments + '-\d+)', 'g');
//...
if(regexpIdFragment.exec(urlInitial)) {
   idCurrentFragment = RegExp.$1;
}
//...
regexpIdFragment = new RegExp('\?(' + settings.idPrefixContentFragments + '-\d+)', 'g');
if(regexpIdFragment.exec(urlCurrent)) {
   idCurrentFragment = RegExp.$1;
}
//...

Ich meine: OK, es funktioniert - aber es ist umständlich und blöde.
Habt Ihr Tipps? Und kennt Ihr vor allem die Ursache dieses Phänomens?

Thanx und ciao,
Andreas

--
No, Sir, I don't like it.
  1. Hallo,

    Habt Ihr Tipps? Und kennt Ihr vor allem die Ursache dieses Phänomens?

    1. Du benutzt anscheinend unnötigerweise den Zusatz 'g'.

    Der zweite Aufruf sucht vermutlich wegen dieses 'g' auch im neuen String den zweiten Treffer und das ergibt null, weil es nur einen Treffer gibt.

    2. SELFHTML schreibt über RegExp u.a. "[...] können Sie [..] anstatt über den zurückgegebenen Array auch über nach oben RegExp.$1 und folgende Eigenschaften zugreifen. Diese Zugriffsweise wird allerdings seit der JavaScript-Version 1.5 als veraltet eingestuft und ist zumindest im Zusammenhang mit exec() auch praktisch unnötig."

    exec() gibt ja ein Array mit den Teiltreffern zurück. Daher bietet es sich an, dieses Array auszuwerten, und nicht RegExp.$1.

    Ob das dein Problem löst, weiss ich nicht sicher, aber es steht zu vermuten.

    Gruß, Don P

    1. Moin,

      1. Du benutzt anscheinend unnötigerweise den Zusatz 'g'.

      Du hast völlig recht. Das war ein Überbleibsel meines ursprünglichen Ansatzes. Das "g" benötige ich in der tat nicht mehr.
      Und insgesamt kann ich das ganze dann tatsächlich stark verienfachen und mit match() arbeiten.
      Das $n benötige ich auch nicht.
      Und siehe da: das Safari-Problem ist aus der Welt!

      Danke für die Schläge auf den Hinterkopf!
      ;)
      Ciao,
      Andreas

      --
      No, Sir, I don't like it.