2011-01-14 11 views
3

Wie schreibe ich eine Regex, , die in wxRegEx funktioniert, um etwas zu diesem Pseudo Regex: *good|better|best*?Regex zu mehreren ganzen Wörtern

Ich weiß über Regex passend auf der Zeichenebene, d. H. *.[ch]pp, aber wie geht es so weit wie ganze Wörter gehen?

Danke.

+0

http://rubular.com/r/UahBdaQNhi? – marcog

+0

@marcog das ist eine großartige Ressource, danke! Warum funktioniert '\ b (gut | besser | am besten) \ b' dort, aber nicht in wxRegEx? –

+0

Eine andere nette Ressource: http://www.regexguru.com/2008/04/wxregex-class-in-wxwidgets/ –

Antwort

2

Diese Frage ist ein gutes Beispiel dafür, warum Sie immer den Flavor von Regex, den Sie verwenden, angeben sollten. Die meisten Regex-Varianten bieten eine Möglichkeit, Wortgrenzen anzupassen, und die meisten verwenden dafür \b. Gemäß this page können Sie mit wxRegEx einen von drei Varianten auswählen: BRE, ERE oder ARE. Von diesen unterstützt nur ARE Wortgrenzen, und es verwendet \y, nicht \b. Angenommen, Sie wxRE_ADVANCED angeben, wenn Sie es kompilieren, wird diese regex beliebige Zeichenfolge übereinstimmen, die eines der Wörter enthält good, better oder best:

\y(good|better|best)\y 

Gemessen an den Beispielen der Sie, ich glaube, Sie verwirrend Regexes sein kann mit Klumpen. Beispiel: *.[ch] ist der Glob, den Sie verwenden würden, um Dateinamen mit .c oder .h abzugleichen; die Regex dafür wäre \.[ch]$. Es gibt ein gutes Regex-Tutorial auf der Seite, mit der ich früher verlinkt habe, aber der Unterschied, der mir am meisten am Herzen liegt, ist, dass eine Regex nicht die gesamte Zeichenfolge beschreiben muss, wie es ein Glob tut. Deshalb musste ich den Regex nicht mit .* starten, aber ich tat müssen $ am Ende hinzufügen, um es von übereinstimmenden Zeichenfolgen wie foo.cs oder bar.html zu halten.

+0

Dies ist eine bemerkenswerte Antwort. Vielen Dank! Ich habe nicht genug Punkte, um dir Punkte zu geben, aber zumindest kann ich kommentieren und sagen: (1) Du hast den grundlegenden Unterschied zwischen einem Glob und einer Regex hervorgehoben.(2) Sie haben die Anforderung für wxRE_ADVANCED notiert (es scheint, dass es auf meinem System nicht aktiviert ist, weil \ y auch nicht funktioniert). (3) Sie haben einen ausgezeichneten Link für einen Überblick über wxRegEx bereitgestellt. Vielen Dank! –

+0

Ah! Ich habe gerade festgestellt, dass Sie mit "wxRE_ADVANCED angeben, wenn Sie es kompilieren" gemeint haben "call wxRegEx :: Compile()". Ich werde es jetzt versuchen ... –

+0

Ja! Es klappt! . \ * \ y (gut | besser | am besten) \ y. \ * - danke. –

1

good|better|best

Ich weiß nicht, was Sie unter "elegant" bedeuten. Soweit es mich betrifft, ist das ziemlich elegant.

+0

Nun, die Pseudo-Regex, die ich gab, ist ... ** pseudo **. Es funktioniert nicht wirklich. Ich brauche einen, der ** funktioniert **. Ich versuchte **. \ * \ B (eins | zwei | drei) \ b. \ ***, aber das funktioniert auch nicht. –

+0

Was meinst du mit "funktioniert nicht"? Welche Sprache verwendest du? Was ist dein Input und was bekommst du? – CanSpice

+0

Ich verwende wxRegEx. By funktioniert nicht, ich meine, es gibt den Fehler "Fehler: ungültiger regulärer Ausdruck '\ * eins | zwei | drei \ *': Quantifizierer Operand ungültig". Es kommt nicht einmal zu dem Text, um Stufe (interaktives Regex-Testprogramm) zu entsprechen. –

Verwandte Themen