2009-02-27 7 views
1

Ich hatte gehofft, jemand könnte mir helfen, eine Regex für C++ zu schreiben, die Wörter in einem Suchwort abgleicht, und es Stück für Stück zu Lernzwecken erklären.regulärer Ausdruck zum Aufteilen der Suchphrase

Was ich brauche, ist ein regulärer Ausdruck, die Zeichenfolge innerhalb " " wie "Hello you all" entspricht, und einzelne Wörter, die beginnt/endet mit * wie *ack/overfl*.

Für das Zitat Teil habe ich \"[\^\\s][\^\"]*\", aber ich kann nicht herausfinden, die Wildcard (*) Teil, und wie ich es mit dem Zitat Regex kombinieren sollte.

+0

„Ich weiß, ich werde regex verwenden.“ Jetzt haben sie zwei Probleme ... –

+0

"Ich weiß, ich werde ein Zitat über Regex zitieren." Jetzt hat der Autor drei Probleme, weil niemand ihm sagt, warum man Regex nicht benutzt! (Nichts persönliches Adam, dieses Zitat wird IMO überstrapaziert.) –

+0

@LFSR Consulting: Danke. – Tomalak

Antwort

0

diesen regulären Ausdruck Versuchen:

(?:\*?\w+\*?|"(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*")+ 

Zur besseren Lesbarkeit ich die Schrägstriche durch \x5C ersetzt.

Der Ausdruck "(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*" stimmt auch mit "foo \"bar\"" und anderen richtigen Escape-Folgezeilen überein (aber nur die " könnte maskiert werden).

So foo* bar *baz *quux* "foo \"bar\"" sollte in aufgeteilt werden:

  • foo*
  • bar
  • *baz
  • *quux*
  • "foo \"bar\""

Wenn Sie nicht bar im Beispiel oben übereinstimmen soll, verwenden Sie diese:

(?:\*\w+|\w+\*|"(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*")+ 
+0

Es tut mir leid, das zu sagen, aber deine erste Regex funktioniert nicht. Es scheint zu jedem einzelnen Wort zu passen: "Dies ist eine" Testzeichenfolge "", obwohl es nur "Testzeichenfolge" entsprechen sollte. – Tomalak

+0

Ich hatte das vorher, dachte aber, dass er auch diese Wörter zusammenbringen möchte. Mal sehen, was Qwark sagt. – Gumbo

+0

Vel ist Montagmorgen und ich habe die Regex bei der Arbeit zu testen, und es hat mehr funktioniert als ich hoffte =), Danke. – Qwark

0

Solange es kein Zitat Verschachtelung (in der Regel nisten ist etwas regex ist schlecht):

"(?:(?<=\\)"|[^"])*"|\*[^\s]+|[^\s]+\* 

Diese Regex für entkam doppelte Anführungszeichen erlaubt ('\"'), obwohl, wenn Sie das brauchen. Und die Übereinstimmung enthält die einschließenden Anführungszeichen.

Diese Regex Spiele:

  • "A string in quotes, possibly containing \"escaped quotes\""
  • *a_search_word_beginning_with_a_star
  • a_search_word_ending_with_a_star*
  • *a_search_word_enclosed_in_stars*

Beachten Sie,, dass es bei Strings wie diese brechen:

  • A broken \"string "with the quotes all \"mangled up\""

Wenn Sie erwarten, (sprich: nicht ganz auszuschließen, kann) diese zu bekommen, bitte regex nicht verwenden, aber einen kleinen Zitat-aware-Parser schreiben. Für eine einmalige Suche und ersetzen Aktivität oder Eingabe in einem garantiert Format, die Regex ist in Ordnung zu verwenden.

Zum Validieren/Analysieren von Benutzereingaben ist die Verwendung nicht geeignet. Da würde ich einen Parser empfehlen. Den Unterschied zu kennen, ist der Schlüssel.

Verwandte Themen