2016-10-24 3 views
1

Ich brauche Hilfe, einen regelmäßigen Ausdruck zu machen. Ich habe eine Zeichenfolge, die zur Kompilierungszeit bekannt ist, nennen wir es SpecificString. Ich habe auch eine andere Zeichenfolge, deren Wert nicht bekannt ist. Nennen wir es zum Beispiel ArbitraryString. Die Eingabezeichenfolge besteht aus einer SpecificString, die ArbitraryString darin an einer beliebigen Position enthält oder an ArbitraryString angrenzt. Ich möchte ein Regex-Muster, das ArbitraryString aus der Eingabe-Zeichenfolge für mich später verwendet.Regex - Wie zeichne ich eine beliebige Zeichenkette auf, die irgendwo in einer bekannten Zeichenkette auftaucht?


Beispiele:

  • Beispielformat: Eingabezeichenfolge => Wert der erfassten Gruppe
  • SpecificArbitraryStringString =>ArbitraryString // innen
  • SpecHAHAHALOLificString =>HAHAHALOL
  • SpecificStringYOLO =>YOLO// benachbart
  • SpecificStrisadng =>sad
  • itsABea8tifulDaySpecificString =>itsABea8tifulDay // auch benachbarte
  • Show to be a heartbreakerpecificString =>how to be a heartbreaker
  • SpecificSt this is the last example ring =>this is the last example (in der Ausgabe des letzten Beispiel stackoverflow.com weggelassen, um die Räume an beiden aus irgendeinem Grund endet, einfach zu ignorieren, dass und annehmen, dass sie es sind)

ich nur in der Lage war, mit einem regulären Ausdruck, deren Länge linear zu kommen mit der Länge von SpecificString wächst es sehr schwierig zu halten. Irgendwelche Ideen?

Pseudocode (nicht unbedingt gültig C#):

static string GetArbitraryString(string input) 
{ 
    const string specificString = "SpecificString"; 
    var regex = // regex pattern to find 
    var match = regex.Match(input); 
    string arbitraryString = match.CapturedGroups[0].Value; 
    return arbitraryString; 
} 

Nur regex Antworten akzeptiert werden.

edit: die neue Frage: Gibt es dafür eine elegante Regex-Lösung?

+4

einen besonderen Grund verwenden würde, warum Sie nur Regex bezogene Antworten akzeptieren?Es scheint, als wäre eine Nicht-Regex-Lösung einfacher. – Abion47

+0

@ Abion47 Ich weiß. Aber ich möchte wirklich wirklich wissen, ob es eine elegante Regex-Lösung gibt. Und ich hoffe wirklich, dass dieser Kommentar diese Frage nicht schließt. – foxneSs

+0

Wenn Sie programmgesteuert die Regex generieren, deren Länge linear mit der Länge von 'SpecificString' wächst, wäre es immer noch schwierig zu pflegen? –

Antwort

1

Nun, hier ist das Beste, was ich in Bezug auf eine regex Antwort haben, conditionals gekettet verwenden Sie nur, um sicherzustellen, den String bekommen Sie wollen (obwohl es meiner Meinung nach immer noch verdammt unelegant ist):

^(.*)?S(?(1)|(.*))?p(?(2)|(.*))?e(?(3)|(.*))?c(?(4)|(.*))?i(?(5)|(.*))?f(?(6)|(.*))?i(?(7)|(.*))?(?(8)|(.*))?c(?(9)|(.*))?S(?(10)|(.*))?t(?(11)|(.*))?r(?(12)|(.*))?i(?(13)|(.*))?n(?(14)|(.*))?g(?(15)|(.*))?$ 

Dann müssen Sie nur über die Capture-Gruppen iterieren und den nicht leeren auswählen. So einfach ist das.

Und da Sie in C# sind, können Sie sogar benannte Erfassungsgruppen mit demselben Namen für alle verwenden. Welcher auch immer aufgenommen wird, ist der Wert des genannten Captures.

Demo on Regex101

+1

Nicht ganz perfekt, da es im ersten Beispiel die Gruppe "Arbitrary" und dann die zweite Instanz von "String" als separate Gruppen erfasst, anstatt den gesamten inneren "ArbitraryString" zu erfassen. – Abion47

+0

@ Abion47: Fest. Aber es ist jetzt viel fieser: P –

+1

Ja, ich behaupte, dass eine Nicht-Regex-Lösung in diesem Fall viel einfacher und eleganter wäre. Dies ist aus informationstechnischer Sicht interessant, aber ich würde diesen Code nie in der Praxis verwenden wollen. – Abion47

-2

ein Wörterbuch

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] inputs = { 
           "input string => captured group's value", 
           "SpecificArbitraryStringString => ArbitraryString // inside", 
           "SpecHAHAHALOLificString => HAHAHALOL", 
           "SpecificStringYOLO => YOLO // adjacent", 
           "SpecificStrisadng => sad", 
           "itsABea8tifulDaySpecificString => itsABea8tifulDay // also adjacent", 
           "Show to be a heartbreakerpecificString => how to be a heartbreaker", 
           "SpecificSt this is the last example ring => this is the last example" 
           }; 

      Dictionary<string, string> dict = new Dictionary<string, string>(); 
      string pattern = "^(?'name'[^=]+)=>(?'value'.*)"; 
      foreach (string input in inputs) 
      { 
       Match match = Regex.Match(input, pattern); 
       dict.Add(match.Groups["name"].Value.Trim(), match.Groups["value"].Value.Trim()); 
      } 
     } 
    } 
} 
+0

Sie lesen die Fragedetails nicht vor dem Posten, oder? Sie verwenden die von mir gelieferten erfassten Gruppenwerte, wenn ich explizit erkläre, dass diese Werte nicht vorhart bekannt sind und mithilfe der Regex aus einer Eingabezeichenfolge extrahiert werden müssen. – foxneSs

+0

Nein, bin ich nicht. Testen Sie einfach die Daten, um meinen Code zu testen. Möchtest du keinen getesteten Code und keinen Code, der nicht funktioniert? – jdweng

Verwandte Themen