2017-11-15 1 views
1

Ich teile eine string mit Regex mit seiner Split() Methode.C# Regex split() ohne Entfernen der geteilten Bedingung Zeichen

var splitRegex = new Regex(@"[\s|{]"); 

string input = "/Tests/ShowMessage { 'Text': 'foo' }"; 

//second version of the input: 
//string input = "/Tests/ShowMessage{ 'Text': 'foo' }"; 

string[] splittedText = splitRegex.Split(input, 2); 

Die string ist nur ein Abtastmuster des Eingangs. Es gibt zwei verschiedene Strukturen von input, einmal mit einem Leerzeichen vor der { oder ohne Leerzeichen. Ich möchte die input auf der { Klammer, um spalten das folgende Ergebnis zu erhalten:

  • /Tests/Showmessage
  • { 'Text': 'foo'}

Wenn es eine Platz, die Saite wird dort aufgeteilt (Platz wird entfernt) und ich bekomme mein gewünschtes Ergebnis. Aber wenn es keinen Platz gibt, spalte ich die Zeichenfolge auf {, so dass die { entfernt wird, was ich aber nicht will. Wie kann ich Regex.Split() verwenden, ohne das Zeichen der geteilten Bedingung zu entfernen?

+4

Verwenden Sie ['@" \ s * (? = {) "'] (Https://ideone.com/QASSyI). –

Antwort

3

Die eckigen Klammern erzeugen einen Zeichensatz, so dass dieser genau mit einem dieser inneren Zeichen übereinstimmt. Für Ihren Wunsch beginnen Sie, indem Sie sie entfernen.

So ist es passend eine Zufallszahl von Whitespaces Sie * hinzufügen müssen, ist das Ergebnis dieses \s*.

  • \s ist ein Leerzeichen
  • * bedeuten Null-oder-mehr

, dass Sie nicht den geteilten Zustand Charakter entfernen, können Sie vorwärtsgerichtete Behauptung (?=...) verwenden.

  • (?=...) oder (?!...) ist eine vorwärtsgerichtete Behauptung

Die kombinierte Regex wie folgt aussieht: \s*(?={)

This ist eine wirklich gute und detaillierte Dokumentation aller verschiedenen Regex Teile, könnten Sie eine haben schau es dir an. Außerdem können Sie Ihre Regex einfach und kostenlos testen here.

0

Um nicht die geschweifte Klammer in dem Spiel sind Sie es in ein Blick setzen voraus sein können

\s*(?={) 

dass eine beliebige Anzahl von weißen Flächen bis zu der Position, bevor eine offene geschweifte Klammer übereinstimmen.

+0

Genau das, was ich gesucht habe. Aber wie beeinflusst das '[]' meinen Regex-Ausdruck? Ich habe es in diesem speziellen Fall nicht verstanden. –

+0

Wird der String dank des Pipe-Charakters nicht überspalten? –

+0

@ L.Guthardt Die eckigen Klammern dienen zum Erstellen eines Zeichensatzes. So wird '[\ s | {]' tatsächlich jedem Leerzeichen des Pipe-Zeichens oder der offenen geschweiften Klammer entsprechen. – juharr

0

können Sie regelmäßige String Split verwenden, auf „{“ und schneiden Sie die Räume aus:

var bits = "/Tests/ShowMessage { 'Text': 'foo' }".Split("{", StringSplitOptions.RemoveEmptyEntries); 
bits[0] = bits[0].TrimEnd(); 
bits[1] = "{" + bits[1]; 

Wenn Sie die RegEx Route verwenden möchten, können Sie hinzufügen, die {zurück, wenn Sie die Regex ein wenig ändern :

var splitRegex = new Regex(@"\s*{"); 

string input = "/Tests/ShowMessage { 'Text': 'foo' }"; 

//second version of the input: 
//string input = "/Tests/ShowMessage{ 'Text': 'foo' }"; 

string[] splittedText = splitRegex.Split(input, 2); 
splittedText[1] = "{" + splittedText[1]; 

Es bedeutet „split bei Auftreten von (null oder mehr Leerzeichen gefolgt von {)“ - so der Split-Betrieb Nukes Ihre Räume (Sie), und die {(Sie wollen nicht), aber Sie kann die {zurück mit der Gewissheit, dass es bedeutet, dass Sie bekommen, was Sie wollen

+0

Ja, es zurück zu addieren oder die Standardmethode 'string.split' zu verwenden ist möglich und erzeugt mein Ergebnis, aber das war nicht das, wonach ich gesucht habe. Es ist komplexer als ich gezeigt habe, nur ein einfaches Beispiel. –