2017-06-09 2 views
1

Ich versuche, n-ten Vorkommen von Unterzeichenfolge zwischen zwei Sonderzeichen zu finden. Beispielsweise. eins | zwei | drei | vier | fünfRegEx String zwischen N und (N + 1) th Occurance

Angenommen, ich suche nach einer Zeichenkette zwischen (n und n + 1) 2. und 3. Auftreten von '|' Charakter, der sich als "drei" herausstellt. Ich möchte es mit RegEx tun. Könnte mich jemand führen?

Mein aktueller Versuch ist wie folgt.

 string subtext = "zero|one|two|three|four"; 
     Regex r = new Regex(@"(?:([^|]*)|){3}"); 
     var m = r.Match(subtext).Value; 
+2

Warum regex und nicht '.Split ('|'). ElementAtOrDefault (2)'? –

+0

Können Sie nicht .Split & den Index verwenden? –

+0

Hallo, ich wollte es in RegEx tun, weshalb ich Split vermeiden wollte. Das ist mein derzeitiger Versuch. var ggg = Regex.Match (Parsed [0], @ "(?: ([^ |] *) |) {4}"). Gruppen; string subtext = "null | eins | zwei | drei | vier"; Regex r = neue Regex (@ "(?: ([^ |] *) |) {3}"); var m = r.Match (Subtext) .Value; –

Antwort

1

verwenden: (?:.*?\|){n}(.[^|]*)

wo n die Zahl Manchmal musst du deinen speziellen Charakter überspringen. Die erste Erfassungsgruppe enthält das Ergebnis.

Demo for n = 2

0

verwendet regulären Ausdruck und dann das n-te Spiel auszuwählen (in diesem Fall 2) aus der Matches Sammlung:

string subtext = "zero|one|two|three|four"; 
Regex r = new Regex("(?<=\|)[^\|]*"); 
var m = r.Matches(subtext)[2]; 
+2

Hi, das würde mich zwingen, Index zu verwenden. Ich möchte damit aufhören und stattdessen den Index innerhalb der RegEx verwenden. Das ist einer der Gründe, warum ich Split nicht benutzt habe –

1

Wenn Sie vollen Zugriff auf C# -Code haben, sollten Sie eine bloße Spaltung Ansatz betrachten:

var idx = 2; // Might be user-defined 
var subtext = "zero|one|two|three|four"; 
var result = subtext.Split('|').ElementAtOrDefault(idx); 
Console.WriteLine(result); 
// => two 

Ein regex verwendet werden können, wenn Sie keinen Zugriff auf Code haben (wenn Sie einige verwenden Tool, das mit .NET Regex mit Strom versorgt wird):

^(?:[^|]*\|){2}([^|]*) 

Siehe regex demo. Es passt

  • ^ - Beginn der Zeichenfolge
  • (?:[^|]*\|){2}-2 (oder anpassen, wie Sie benötigen) oder mehrere Sequenzen von:
    • [^|]* - null oder mehr Zeichen andere als |
    • \| - a | symbol
  • ([^|]*) - Gruppe 1 (Zugang über .Groups[1]): null oder mehr Zeichen andere als |

C# -Code-Test:

var pat = [email protected]"^(?:[^|]*\|){{{idx}}}([^|]*)"; 
var m = Regex.Match(subtext, pat); 
if (m.Success) { 
    Console.WriteLine(m.Groups[1].Value); 
} 
// => two 

Siehe C# demo

Wenn ein Werkzeug nicht Sie Zugriff nicht lassen erfasste Gruppen, wandeln Sie den Anfangsteil in ein nicht konsumierendes Lookbehind-Muster um:

(?<=^(?:[^|]*\|){2})[^|]* 
^^^^^^^^^^^^^^^^^^^^ 

Siehe this regex demo. Das positive Lookbehind (?<=...) prüft nur nach einer Musterpräsenz unmittelbar links vom aktuellen Ort, und wenn das Muster nicht übereinstimmt, schlägt die Übereinstimmung fehl.