2017-03-16 6 views
1

Nun, ich hoffe, der Titel ist nicht zu verwirrend. Meine Aufgabe ist es, alle X s, die zwischen Y und Z liegen, zusammenzufassen (und zu ersetzen).Entsprechen alle 'X' von 'Y' bis 'Z'

Ich benutze X,Y,Z da diese Werte zur Laufzeit variieren können, aber das ist überhaupt kein Problem.

Was ich bisher ausprobiert habe, ist dies:

pattern = ".*Y.*?(X).*?Z.*"; 

Welche tatsächlich funktioniert .. aber nur für eine X. Ich kann einfach nicht herausfinden, wie alle X s zwischen diesen "Tags" übereinstimmen.

Ich habe auch versucht diese:

pattern = @"((Y|\G).*?)(?!Z)(X)" 

Aber das passt zu allen X s, das Ignorieren der "Tags".

Was ist das richtige Muster, um mein Problem zu lösen? Vielen Dank im Voraus :)

bearbeiten

einige weitere Informationen:

X ist eine einzige char, Y und Z sind strings

Eine wirkliche Leben Test string:

Some.text.with.dots [nodots]remove.dots.here[/nodots] again.with.dots 

=> Übereinstimmung . s betw een [nodots] und [/nodots]

(Anmerkung: verwendete ich xml-ähnliche Syntax hier, aber das garantiert nicht so kann ich leider keine einfache XML oder HTML-Parser verwenden)

+2

Ich bin Angst, Sie müssen eine realistischere Beispiel-Zeichenfolge bereitstellen. –

+0

Sie haben es offensichtlich versucht "? (X *)" ... oder "X" bedeutet Zeichenfolge? –

+0

Siehe [diese Demo] (http://regexstorm.net/Tester?p=%28%3f%3a%5cG%28%3f!%5e%29%7cy%28%3f%3d%5b%5ez%5d * z% 29% 29% 5b% 5ezx% 5d *% 28x% 29 & i = + gh + y + hh + x + x + x + z). Alle 'x's sind in der Gruppe 1. Oder [this one] (http://regexstorm.net/Tester?p=y%28%3f%3a%5b%5ezx%5d*%28x%29%29*%) 5b% 5ez% 5d * z & i = + gh + y + hh + x + x + x + z). –

Antwort

2

In C#, wenn Sie ersetzen müssen etwas Text in einem Block Text, können Sie die Blöcke mit einem einfachen Regex wie (?s)(START)(.*?)(END) übereinstimmen und dann in einem Match-Evaluator die notwendigen Ersetzungen in den übereinstimmenden Blöcken vornehmen.

In Ihrem Fall können Sie so etwas wie

var res = Regex.Replace(str, @"(?s)(\[nodots])(.*?)(\[/nodots])", 
    m => string.Format(
     "{0}{1}{2}", 
      m.Groups[1].Value,     // Restoring start delimiter 
      m.Groups[2].Value.Replace(".",""), // Modifying inner contents 
      m.Groups[3].Value     // Restoring end delimiter 
     ) 
    ); 

Siehe C# online demo

Muster Details verwenden:

  • (?s) - eine Inline-Version der RegexOptions.Singleline Modifikator Flagge
  • (\[nodots]) - Gruppe 1: Startbegrenzer (Zeichenkette [nodots])
  • (.*?) - Gruppe 2: alle 0+ Zeichen so wenig wie möglich
  • (\[/nodots]) - Gruppe 3: Endbegrenzer (Zeichenkette [/nodots])
Verwandte Themen