Ich habe Problem mit Feinabstimmung von regex bekam
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
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