2017-07-19 2 views
-4

Mein Ziel zu finden ist, zu schreiben beginnen und enden Muster und entfernen Sie sie aus einer langen KetteIch versuche, einen regulären Ausdruck für C#

{BEGIN:781}{hopi_docgen4}{sub_chronic_conditions_hpi}{END:}{OPh_cc_docgen}{END:621}{BEGIN:768}{cc_reviewed} {cc_rev_prov}{END:768} 

Erforderlich REGx sollte diese => erfüllen beginnen und gefolgt Ende durch einen vollen Doppelpunkt und dann durch die ganze Zahl und alle diese in geschweiften Klammern wie folgt gefolgt {} und das muss funktioniert unabhängig von dem Fall

{Begin:100} or {end:112} or {BEGIN:105} or {END:398} 

Derzeit meine Lösung ist dies

\b{begin:[0-1][0-1][0-1]}\b 
+0

Was haben Sie bisher versucht? Sieht nach Hausaufgaben aus. Wir sind nicht hier, um deine Hausaufgaben zu machen. –

+0

In den Buchungsrichtlinien (bitte vor dem Posten lesen) 'Fragen, die nach Hausaufgabenhilfe fragen, müssen eine Zusammenfassung der bisherigen Arbeit enthalten, um das Problem zu lösen, und eine Beschreibung der Schwierigkeit, die Sie haben, zu lösen. – garethb

+0

This ist mein erstes Regex-Experiment, deshalb habe ich es nicht geschrieben \ b {begin: [0-1]} \ b –

Antwort

1

Sie können einen einzelnen regex Ersatz verwenden:

public string FindMacroType(string sentence) 
{ 
    return Regex.Replace(sentence, @"(?i){(?:END|BEGIN):[0-9]{3}}", ""); 
} 

die Sehen regex demo

Muster Details

  • (?i) - Groß- und Kleinschreibung Modifikator
  • { - eine wörtliche { (keine Notwendigkeit zu entkommen, aber man kann)
  • (?:END|BEGIN) - entweder end oder begin
  • : - ein Doppelpunkt
  • [0-9]{3} - 3 ASCII Ziffern (wenn es eine oder mehrere Ziffern sein kann, ersetzen Sie einfach {3} begrenzenden Quantifizierer mit einem + Quantor, der 1 oder mehr Vorkommen entspricht)
  • } - ein Literal } (keine Notwendigkeit zu entkommen).
+0

Vielen Dank ..... Mein upvote ist für die ausführliche Erklärung. –

-1

Meiner Meinung nach ist Regex über gebraucht. Es sollte nur verwendet werden, wenn eine String-Methode nicht funktioniert oder zu kompliziert wird. In diesem Fall denke ich, dass eine String-Methode besser ist:

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 input = "{BEGIN:781}{hopi_docgen4}{sub_chronic_conditions_hpi}{END:}{OPh_cc_docgen}{END:621}{BEGIN:768}{cc_reviewed} {cc_rev_prov}{END:768}"; 
      string output = RemovePattern(input, 781); 
     } 

     static string RemovePattern(string input, int id) 
     { 
      string output = ""; 
      string beginPattern = string.Format("{0}BEGIN:{1}{2}", "{", id.ToString(), "}"); 
      string endPattern = string.Format("{0}END:{1}{2}", "{", id.ToString(), "}"); 


      int beginIndex = input.IndexOf(beginPattern); 
      int endIndex = input.IndexOf(endPattern); 
      if (endIndex == -1) 
      { 
       endPattern = "{END:}"; 
       endIndex = input.IndexOf(endPattern, beginIndex); 
      } 
      int lengthEnd = endPattern.Length; 
      if ((beginIndex >= 0) && (endIndex >= 0)) 
      { 
       int stringLength = (endIndex + lengthEnd) - beginIndex; 

       output = input.Substring(0, beginIndex) + input.Substring(endIndex + lengthEnd); 

      } 

      return output; 
     } 
    } 
} 
+0

Es tut mir leid, das funktioniert überhaupt nicht; Der Grund, warum wir die Int ID nicht kennen. Deshalb brauchen wir eine Regex –

+0

Dann können Sie Regex in der RemovePattern-Methode verwenden, um END zu erhalten. Manchmal wird eine Mischung aus String und Regex benötigt. Ich bin nicht gegen Regex, aber es ist nicht so effizient wie eine String-Methode. – jdweng

+0

Ich war mir anfangs nicht sicher, ob der fehlende Index ein Tippfehler war. Korrigiert den Code um mit dem fehlenden Index zu arbeiten. Angenommen, der fehlende Index war das erste END nach dem BEGIN. – jdweng

0

Danke für alle negativen Stimmen; Ich habe meine Antwort gefunden;

public string FindMacroType(string sentence) 
{ 

    Regex begin = new Regex(@"(\{)(BEGIN\:)[0-9][0-9][0-9](\})",RegexOptions.IgnoreCase); 
    sentence = begin.Replace(sentence,""); 

    Regex end = new Regex(@"(\{)(END\:)[0-9][0-9][0-9](\})", RegexOptions.IgnoreCase); 
    sentence = end.Replace(sentence, ""); 

    return sentence; 
} 
+0

Der Code ersetzt nur die Zeichenfolge, wenn es das erste BEGIN/END in der ursprünglichen Zeichenfolge ist. Mein Code ersetzt jeden Block. – jdweng

Verwandte Themen