2017-07-13 1 views
0

Ich versuche, etwas Text zu entfernen und nur kleinen Text aus der Zeichenfolge zu behalten.
Eigentlich bin ich sehr neu in Regex, ich habe einen Artikel gelesen und es nicht sehr gut verstanden.
Hier ist ein Beispiel meines Textes (jede Zeile in separaten String-Objekt)Regex in C#, um einen Text zu verarbeiten

2015-03-08 10:30:00  /user841/column-width 
2015-03-08 10:30:01  /user849/connect 
2015-03-08 10:30:01  /user262/open-level2-price/some other text 
2015-03-08 10:30:01  /user839/open-detailed-quotes 

Ich möchte sie verarbeiten Regex in C# und haben die folgende Ausgabe:

column-width 
connect 
open-level2-price/some other text 
open-detailed-quotes 

ich verwendet habe, die folgende Zeile, das zu tun, aber es gibt eine Ausnahme aus:

Match match = Regex.Match(line, @"*./user\d+/*."); 

Die Ausnahme:

System.ArgumentException: 'Analysieren "*./user\d+/*." - Quantifier {x,y} folgenden nichts.'

könnte jemand bitte helfen!

+1

Willkommen Überlauf zu stapeln. Bitte lesen Sie [Wie Sie fragen] (https://stackoverflow.com/help/how-to-ask) und wie Sie ein [minimales, vollständiges und verifizierbares Beispiel] erstellen können (https://stackoverflow.com/help/mcve). – numaroth

+0

Sie sagen "Ich versuche, etwas Text zu entfernen". Wie geht es dir? Warum hast du gedacht, dass es nicht funktioniert hat? Sie haben dieses "C#" markiert, aber ich sehe hier keinen C# -Code. SO ist eine Frage-und-Antwort-Seite und "könnte jemand helfen?" [Ist keine Frage, die wir beantworten können] (https://softwareengineering.meta.stackexchange.com/questions/7273/). –

+0

Sie brauchen keine Regex für diese – maccettura

Antwort

3

Der Fehler wird durch die Tatsache verursacht bekommen, dass Sie versuchen, den Anfang des Musters zu quantifizieren, die einen Fehler in einer .NET Regex angesehen wird. Vielleicht wollten Sie .* anstelle der *. (um alle 0 + Zeichen gierig, so viele wie möglich) zu verwenden, aber es ist sicherlich nicht das, was Sie nach den erwarteten Ergebnissen zu beurteilen brauchen.

Sie benötigen

/user\d+/(.*) 

Siehe regex demo

Einzelheiten:

  • /user - eine wörtliche Teilzeichenfolge /user
  • \d+-1 oder mehrere Ziffern (verwendenOption, um nur ASCII-Ziffern mit \d in einer .NET Regex)
  • / zu entsprechen - eine wörtliche /
  • (.*) - A Erfassung Gruppe # 1, das entspricht alle 0+ Zeichen andere als eine neue Zeile (ersetzen * mit + um mindestens 1 Char zu entsprechen).

enter image description here

C#:

var results = Regex.Matches(s, @"/user\d+/(.*)") 
    .Cast<Match>() 
    .Select(m => m.Groups[1].Value) 
    .ToList(); 
+1

Vielen Dank, du hast mir geholfen. :) –

+0

Ja pf natürlich habe ich deine Antwort gewählt. –

1

Statt Regex verwenden, teilten Sie einfach auf dem '/' Charakter und den letzten Index des Arrays verwenden (unter Verwendung von LINQ):

string inputString = "2015-03-08 10:30:01  /user262/open-level2-price"; 
inputString.Split('/').Last(); 

Split gibt einen Array von Strings, in Ihrem Fall mit dem Probeneingang oben der String-Array würde wie folgt aussehen:

array[0] = "2015-03-08 10:30:01  " 
array[1] = "user262" 
array[2] = "open-level2-price" 

Sie zeigen Sie immer den letzten Teil wollen so nur LINQ verwenden, um den .Last() Index des Arrays zu nehmen.

Fiddle here

+0

Ja Das ist ein guter Punkt, aber das Problem ist, ich garantiere nicht den Text, ich möchte keinen Schrägstrich haben. –

+0

@ O-BL Ich bin verwirrt, Ihr Regex-Ausdruck sucht gezielt nach Schrägstrichen. Wenn Sie nicht garantieren können, dass Schrägstriche da sind, wie würde dann Ihre Regex funktionieren? – maccettura

+0

die Eingabe-Zeichenfolge kann etwas wie diese "2015-03-08 10:30:01/user262/open-level2-price/einige andere Text" und die Ausgabe so sein wie "open-level2-price/einige andere Text" , so ist die reguläre Form: das Datum dann das "Benutzer" Wort dann die Benutzernummer. –

0

Hier ist ein einfaches Beispiel, wie die Regex.Replace statische Methode zu verwenden.

https://dotnetfiddle.net/JuUF9E

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string[] lines = new string[] { 
      "2015-03-08 10:30:00  /user841/column-width", 
      "2015-03-08 10:30:01  /user849/connect", 
      "2015-03-08 10:30:01  /user262/open-level2-price", 
      "2015-03-08 10:30:01  /user839/open-detailed-quotes" 
     }; 

     string pattern = @"(.*/.*/)(.*)"; 

     string replacement = "$2"; 

     foreach(var line in lines) 
     { 
      Console.WriteLine(Regex.Replace(line, pattern, replacement)); 
     } 
    } 
} 
+0

könnten Sie das dritte Beispiel aus der obigen Frage lesen? –

0

Ich weiß nicht, warum Sie versuchen, diese einfache Sache mit Regex zu tun, müssen Sie nur die Linien und durch die ‚\‘ aufgeteilt lesen müssen, wählen sie den letzten Index und das ist es. Zum Beispiel, wenn Sie diese Daten in einer Datei haben Sie so etwas wie diese verwenden:

string newString = ""; 
StreamReader sr = new StreamReader('log.txt'); 
while(!sr.ReadLine) 
{ 
    string[] splitted = sr.ReadLine().Split('/'); 
    if(splitted.Length > 0) 
     newString += splitted[splitted.Length - 1]; 
} 
sr.Close(); 

Am Ende enthält die Neuerstring Variable, was Sie wollen. Ansonsten können Sie jede Zeile in einer Liste hinzufügen, wenn Sie mit den Daten etwas machen wollen.

+0

könnten Sie das dritte Beispiel aus der obigen Frage lesen? –

0

Wie wäre es mit Look around

var line = "2015-03-08 10:30:01  /user839/open-detailed otes/dsada/dsa/das/dsadsa"; 

// dsadsa 
var match = Regex.Match(line, @"(?!.*/).*").Value; 
+0

das gibt mir einen Fehler. Eigentlich @ WiktorStribiżew bereits beantwortet die Frage. Danke. :) –

+0

Update, fehlte "Match" –

+0

Danke für Hilfe, ich denke, die Ausgabe-String sollte 'offen-detaillierte otes/dsada/dsa/das/dsadsa' –

Verwandte Themen