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.
Warum regex und nicht '.Split ('|'). ElementAtOrDefault (2)'? –
Können Sie nicht .Split & den Index verwenden? –
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; –