2010-12-17 5 views
0

Ive erhielt den Text:Problem mit Regex, wie bekomme ich alle mit S bis zu einem Sonderzeichen?

192.168.20.31 Url=/flash/56553550_hi.mp4?token=(uniquePlayerReference=81781956||videoId=1) 

Und im Versuch, die uniquePlayerReference und die videoId

Ive diesem regulären Ausdruck versucht, zu erhalten:

(?<=uniquePlayerReference=)\S* 

aber es passt:

81781956||videoId=1) 

Und dann versuche ich und bekomme die Video ID mit th ist:

(?<=videoId=)\S* 

Aber es entspricht der) nach der videoId.

Meine Frage ist zweifach:

1) Wie kann ich die \ S-Zeichen verwenden, und bekommen es in einem Charakter zu stoppen? (im Wesentlichen was ist die Regex zu tun, was ich will) Ich kann es nicht bei einem definierten Charakter zu stoppen, ich denke, ich brauche eine positive Lookahead zu entsprechen, aber nicht die Doppel-Pipe enthalten).

2) Wann sollte ich Klammern verwenden?

Antwort

1

Wenn die ID nicht nur Ziffern dann könnte man [^|] statt \S, dh

(?<=uniquePlayerReference=)[^|]* 

verwenden dann können Sie

verwenden
(?<=videoId=)[^)]* 

Für die Video-ID

+0

Das ist eine wirklich gute Antwort, ich sehe, was du getan hast, es sagt, eine beliebige Anzahl von Zeichen bis dahin, wo es nicht = |, Genie! – Exitos

+0

@ Pete2k: Nicht so viel Genie als eine vernünftige Lösung ohne vollständige Spezifikationen. Wenn die IDs immer Zahlen sind, ist die Lösung von @ annakata eleganter. – Lazarus

+0

lol okay, Kumpel, sie sind nicht immer Zahlen so schlecht nutzen Sie als die Antwort in diesem Fall, obwohl ich sie alle als hilfreich markiert haben, wie sie alle mir etwas gelehrt haben, wusste ich nicht! – Exitos

2

Da beide IDs numerisch sind, sind Sie wahrscheinlich besser dran mit \d anstelle von \S. \d entspricht nur numerischen Ziffern, während \S alle Nicht-Leerzeichen entspricht.

Was Sie vielleicht auch tun, ist ein nicht Gready Spiel bis das gewünschte Zeichen nicht wie so passen:

uniquePlayerReference=(.*?)\|\|videoId=(.*?)\) 

Bitte beachte, dass ich entkommen die beiden | und ) Zeichen, denn sonst würden sie haben eine besondere Bedeutung in einer Regex.

In C# würden Sie das so verwenden: (was auch Ihre Frage beantwortet, wofür die Klammern sind, sie sollen Teile des übereinstimmenden Ergebnisses erfassen).

Regex regex = new Regex(@"uniquePlayerReference=(.*?)\|\|videoId=(.*?)\)"); 
Match match = regex.Match(
    "192.168.20.31 Url=/flash/56553550_hi.mp4?token=(uniquePlayerReference=81781956||videoId=1)"); 

if (match.Success) 
{ 
    string playerReference = match.Groups[1].Value; 
    string videoId = match.Groups[2].Value; 
    // Etc. 
} 
+0

das ist eine große Resonanz und arbeitet, aber in meiner Suche zu beherrschen kann jemand eine Lösung tun, wo es um das zusammenpassen würde || unabhängig davon, was die Werte waren? (es sei denn, ein Doppelpapst war natürlich dabei) :-) – Exitos

+0

Das wird nicht funktionieren, das '. *' ist ein gieriges Spiel und wird den Rest des Strings ziemlich glücklich lesen. Sie müssten '. *' Durch '. *?' Ersetzen, um es nicht gierig zu machen, dann würde es aufhören, wenn es das nächste Zeichen '|' (braucht nicht zu entkommen) trifft. – Lazarus

+0

@Lazarus: Du hast Recht. Ich sollte meine Lösung schnell bearbeiten. Ich habe es wieder so verändert, wie es vorher war. –

2

Das Problem ist die mul; tiplicity Operator Sie hier haben - die * - die "so viele wie möglich" bedeutet. Wenn Sie eine explizite Zahl haben, können Sie den Operator {a,b} verwenden, wobei a ein Minimum und b eine maximale Anzahl an Übereinstimmungen ist. Wenn Sie jedoch eine unbekannte Nummer haben, können Sie \ S nicht verwenden (was zu allgemein ist).

Wie für Klammern, wenn Sie meinen, () Sie verwenden sie, um einen Teil einer Übereinstimmung für Backreferencing zu erfassen. Etwas kompliziert, denke, dass Sie dafür eine reference verwenden müssen.

Ich glaube, Sie so etwas wie dies wollen:

/uniquePlayerReference=(\d+)||videoId=(\d+)/i 

und dann Rückreferenzierung 1 und \ 2 jeweils auf \.

1

Das \ S bedeutet, dass es mit allen Nicht-Leerzeichen übereinstimmt, einschließlich der schließenden Klammer.Also, wenn Sie \ S verwenden hätten, würden Sie explizit müssen Halt an der schließenden Klammer sagen, wie folgt aus:

videoId=(\S+)\) 

Daher sind Sie besser dran, die \ d verwenden, da das, was Sie suchen, numerisch sind :

uniquePlayerReference=(\d+) 
videoId=(\d+) 
Verwandte Themen