Frage

Ich habe regex bekam, die in Ordnung war, aber wie es camed aus nicht gut funktioniert in manchen Situationen

Halten Auge auf Meldung Vorschau Ursache Message-Editor einige knifflige Dinge tun mit "\"

  

[\ [] [\ ^% # \ $ \ * @ \ -;?] * [\ ^% # \ $ \ * @ \ -;.?] [\]]

seine Aufgabe ist, Muster zu finden, die in der Regel so aussieht

  

[ABA]

  • A - Zeichen von Satz ^,%, #, $, *, @, - ,;
  • B - einiger Text
  • [und] sind im Muster

wird erwartet, dass alle Vorkommen dieses Musters in Test-String finden

  

Black Fuchs [# sample1 #] [% sample2%] -. [# Sample3 #] isst Blöcke

, sondern die erwarteten Trefferliste

  • "[# sample1 #]"
  • "[% sample2%]"
  • "[# sample3 #]"

ich diese

  • "[# sample1 #]"
  • "[% sample2%]"
  • "- [# sample3 #]"

Und es scheint, dass dieses Problem auch mit anderen Zeichen in der Serie „A“ auftreten wird. So jemand Änderungen an meiner regex vorschlagen könnte, damit es funktioniert, wie ich brauche?

und weniger wichtige Sache, wie meinen regex machen Muster auszuschließen, die so aussehen

  

[ABC]

  • A - Zeichen von Satz ^,%, #, $, *, @, - ,;
  • B - einiger Text
  • C - Zeichen von Satz ^,%, #, $, *, @, - ,; andere als A
  • [und] sind im Muster

zum Beispiel

  

[$ sample1 #] [% sample2 @] [% sample3;]

Vielen Dank im Voraus

MTH

War es hilfreich?

Lösung

\[([%#$*@;^-]).+?\1\]

angewendet Text:

Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.

Streichhölzer

  • [#sample1#]
  • [%sample2%]
  • [#sample3#]
  • aber nicht [%sample4;]

EDIT

Dies funktioniert für mich (Output als erwartet, regex von C # akzeptiert wie erwartet):

Regex re = new Regex(@"\[([%#$*@;^-]).+?\1\]");
string s = "Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.";

MatchCollection mc = re.Matches(s);
foreach (Match m in mc)
{
  Console.WriteLine(m.Value);
}

Andere Tipps

Warum die erste "?" in "[[]?"

\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]

würde erkennen Ihre verschiedenen Saiten ganz gut

Um genauer zu sein:

\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]

würde erkennen [ABA]

\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]

würde erkennen [ABC]

Sie haben eine optionale Anpassung der Öffnungs eckigen Klammer:

[\]]?

Für den zweiten Teil von euch in Frage (und vielleicht zu vereinfachen) versuchen Sie dies:

\ [\% [^ \%] + \% \] | \ [\ # [^ \ #] + \ # \] | \ [\ $ [^ \ $] + \ $ \]

In diesem Fall gibt es ein Untermuster für jedes mögliche Trennzeichen. die | Charakter ist „OR“, so wird es, wenn eine der drei Unterausdrücke Spiel entsprechen.

Jede subexpression werden:

  • Öffnen Klammer
  • Spezielle Char
  • Alles, was nicht ein spezielles Zeichen (1)
  • ist
  • Spezielle Zeichen
  • Schließen Backe

(1) müssen möglicherweise zusätzliche Ausnahmen hinzufügen wie ‚]‘ oder ‚[‘, damit es nicht versehentlich über einen großen Bestand an Text passen wie:

[% MyVar #] bla bla [$ othervar%]

Rob

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top