it-swarm.com.de

String zwischen zwei Strings in einem String abrufen

Ich habe eine Zeichenfolge wie:

"super exemple of string key : text I want to keep - end of my string"

Ich möchte nur die Zeichenfolge behalten, die zwischen "key : " und " - " liegt. Wie kann ich das machen? Muss ich eine Regex verwenden oder kann ich es auf andere Weise tun?

74
flow

Vielleicht ist ein guter Weg, einfach einen Teilstring auszuschneiden:

String St = "super exemple of string key : text I want to keep - end of my string";

int pFrom = St.IndexOf("key : ") + "key : ".Length;
int pTo = St.LastIndexOf(" - ");

String result = St.Substring(pFrom, pTo - pFrom);
108
Dmitry Bychenko
string input = "super exemple of string key : text I want to keep - end of my string";
var match = Regex.Match(input, @"key : (.+?)-").Groups[1].Value;

oder nur mit Stringoperationen

var start = input.IndexOf("key : ") + 6;
var match2 = input.Substring(start, input.IndexOf("-") - start);
29
I4V

Sie können es ohne Regex tun

 input.Split(new string[] {"key :"},StringSplitOptions.None)[1]
      .Split('-')[0]
      .Trim();
22
Anirudha

Je nachdem, wie robust/flexibel Ihre Implementierung sein soll, kann dies tatsächlich etwas schwierig sein. Hier ist die Implementierung, die ich verwende:

public static class StringExtensions {
    /// <summary>
    /// takes a substring between two anchor strings (or the end of the string if that anchor is null)
    /// </summary>
    /// <param name="this">a string</param>
    /// <param name="from">an optional string to search after</param>
    /// <param name="until">an optional string to search before</param>
    /// <param name="comparison">an optional comparison for the search</param>
    /// <returns>a substring based on the search</returns>
    public static string Substring(this string @this, string from = null, string until = null, StringComparison comparison = StringComparison.InvariantCulture)
    {
        var fromLength = (from ?? string.Empty).Length;
        var startIndex = !string.IsNullOrEmpty(from) 
            ? @this.IndexOf(from, comparison) + fromLength
            : 0;

        if (startIndex < fromLength) { throw new ArgumentException("from: Failed to find an instance of the first anchor"); }

            var endIndex = !string.IsNullOrEmpty(until) 
            ? @this.IndexOf(until, startIndex, comparison) 
            : @this.Length;

        if (endIndex < 0) { throw new ArgumentException("until: Failed to find an instance of the last anchor"); }

        var subString = @this.Substring(startIndex, endIndex - startIndex);
        return subString;
    }
}

// usage:
var between = "a - to keep x more stuff".Substring(from: "-", until: "x");
// returns " to keep "
11
ChaseMedallion

Regex ist hier übertrieben.

Sie könnten verwenden string.Split mit der Überladung, die einen string[] für die Trennzeichen erfordert, aber das wäre auch ein Overkill.

In Substring und IndexOf - schauen Sie sich die erste an, um Teile eines Strings und einen Index und eine Länge zu erhalten, und den zweiten, um indexierte innere Strings/Zeichen zu finden.

10
Oded

So kann ich das machen

   public string Between(string STR , string FirstString, string LastString)
    {       
        string FinalString;     
        int Pos1 = STR.IndexOf(FirstString) + FirstString.Length;
        int Pos2 = STR.IndexOf(LastString);
        FinalString = STR.Substring(Pos1, Pos2 - Pos1);
        return FinalString;
    }
8

Ich denke das funktioniert: 

   static void Main(string[] args)
    {
        String text = "One=1,Two=2,ThreeFour=34";

        Console.WriteLine(betweenStrings(text, "One=", ",")); // 1
        Console.WriteLine(betweenStrings(text, "Two=", ",")); // 2
        Console.WriteLine(betweenStrings(text, "ThreeFour=", "")); // 34

        Console.ReadKey();

    }

    public static String betweenStrings(String text, String start, String end)
    {
        int p1 = text.IndexOf(start) + start.Length;
        int p2 = text.IndexOf(end, p1);

        if (end == "") return (text.Substring(p1));
        else return text.Substring(p1, p2 - p1);                      
    }
7
fr0ga

oder mit einer Regex.

using System.Text.RegularExpressions;

...

var value =
    Regex.Match(
        "super exemple of string key : text I want to keep - end of my string",
        "key : (.*) - ")
    .Groups[1].Value;

mit einem laufendem Beispiel .

Sie können entscheiden, ob es zu viel ist.

oder

als untervalidierte Erweiterungsmethode

using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        var value =
                "super exemple of string key : text I want to keep - end of my string"
                    .Between(
                        "key : ",
                        " - ");

        Console.WriteLine(value);
    }
}

public static class Ext
{
    static string Between(this string source, string left, string right)
    {
        return Regex.Match(
                source,
                string.Format("{0}(.*){1}", left, right))
            .Groups[1].Value;
    }
}
5
Jodrell
 string str="super exemple of string key : text I want to keep - end of my string";
        int startIndex = str.IndexOf("key") + "key".Length;
        int endIndex = str.IndexOf("-");
        string newString = str.Substring(startIndex, endIndex - startIndex);
5
Dejan Ciev

Eine funktionierende LINQ-Lösung:

string str = "super exemple of string key : text I want to keep - end of my string";
string res = new string(str.SkipWhile(c => c != ':')
                           .Skip(1)
                           .TakeWhile(c => c != '-')
                           .ToArray()).Trim();
Console.WriteLine(res); // text I want to keep
4
w.b

Da : und - eindeutig sind, können Sie Folgendes verwenden: 

string input;
string output;
input = "super example of string key : text I want to keep - end of my string";
output = input.Split(new char[] { ':', '-' })[1];
3
Michael Freeman

Sie können die Erweiterungsmethode unten verwenden:

public static string GetStringBetween(this string token, string first, string second)
    {            
        if (!token.Contains(first)) return "";

        var afterFirst = token.Split(new[] { first }, StringSplitOptions.None)[1];

        if (!afterFirst.Contains(second)) return "";

        var result = afterFirst.Split(new[] { second }, StringSplitOptions.None)[0];

        return result;
    }

Verwendung ist: 

var token = "super exemple of string key : text I want to keep - end of my string";
var keyValue = token.GetStringBetween("key : ", " - ");
2
serefbilge

Ich habe das Code-Snippet von Vijay Singh Rana verwendet, das im Grunde genommen die Aufgabe erfüllt. Es verursacht jedoch Probleme, wenn das firstString bereits das lastString enthält. Ich wollte ein access_token aus einer JSON-Antwort extrahieren (kein JSON-Parser geladen). Mein firstString war \"access_token\": \" und mein lastString war \". Am Ende hatte ich eine kleine Modifikation

string Between(string str, string firstString, string lastString)
{    
    int pos1 = str.IndexOf(firstString) + firstString.Length;
    int pos2 = str.Substring(pos1).IndexOf(lastString);
    return str.Substring(pos1, pos2);
}
2
user3231903

Sie haben bereits einige gute Antworten und ich weiß, dass der von mir bereitgestellte Code alles andere als effizient und sauber ist. Ich dachte jedoch, es könnte für Bildungszwecke nützlich sein. Wir können den ganzen Tag über vorgefertigte Klassen und Bibliotheken verwenden. Aber ohne das Innenleben zu verstehen, ahmen wir es einfach nach und wiederholen es und werden nie etwas lernen. Dieser Code funktioniert und ist grundlegender oder "jungfräulich" als einige der anderen:

char startDelimiter = ':';
char endDelimiter = '-';

Boolean collect = false;

string parsedString = "";

foreach (char c in originalString)
{
    if (c == startDelimiter)
         collect = true;

    if (c == endDelimiter)
         collect = false;

    if (collect == true && c != startDelimiter)
         parsedString += c;
}

Am Ende wird die gewünschte Zeichenfolge der Variablen parsedString zugewiesen. Denken Sie daran, dass damit auch fortlaufende und vorhergehende Leerzeichen erfasst werden. Denken Sie daran, dass ein String einfach ein Array von Zeichen ist, das wie andere Arrays mit Indizes usw. bearbeitet werden kann.

Sich kümmern.

1
flyNflip
var matches = Regex.Matches(input, @"(?<=key :)(.+?)(?=-)");

Dies gibt nur die Werte zwischen "Schlüssel:" und dem folgenden Vorkommen von "-" zurück.

1
fboethius

Wenn Sie nach einer 1-Zeilen-Lösung suchen, ist dies Folgendes:

s.Substring(s.IndexOf("eT") + "eT".Length).Split("97".ToCharArray()).First()

Die gesamte 1-Zeilen-Lösung mit System.Linq:

using System;
using System.Linq;

class OneLiner
{
    static void Main()
    {
        string s = "TextHereTisImortant973End"; //Between "eT" and "97"
        Console.WriteLine(s.Substring(s.IndexOf("eT") + "eT".Length)
                           .Split("97".ToCharArray()).First());
    }
}
0
Vityata

Da ich immer sage, nichts ist unmöglich:

string value =  "super exemple of string key : text I want to keep - end of my string";
Regex regex = new Regex(@"(key \: (.*?) _ )");
Match match = regex.Match(value);
if (match.Success)
{
    Messagebox.Show(match.Value);
}

Hoffe, dass ich geholfen habe.

Hope That I Helped.

0
Ahmed Alaa