Подтвердить что ты не робот

Получить строку между двумя строками в строке

У меня есть строка вроде:

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

Я хочу просто сохранить строку, которая находится между "key : " и " - ". Как я могу это сделать? Должен ли я использовать регулярное выражение или я могу сделать это по-другому?

4b9b3361

Ответ 1

Возможно, хороший способ - это просто вырезать подстроку:

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);

Ответ 2

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;

или только с строковыми операциями

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

Ответ 3

Вы можете сделать это без регулярного выражения

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

Ответ 4

В зависимости от того, насколько надежным/гибким вы хотите, чтобы ваша реализация была, это может быть немного сложнее. Здесь реализация, которую я использую:

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 "

Ответ 5

Вот как я могу это сделать

   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;
    }

Ответ 6

Regex здесь переполняется.

Вы можете использовать string.Split с перегрузкой, которая принимает string[] для разделителей, но это также будет излишним.

Посмотрите Substring и IndexOf - первое, чтобы получить части строки, указанной и индекс, и длину, а второй - для поиска индексированных внутренних строк/символов.

Ответ 7

Я думаю, что это работает:

   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);                      
    }

Ответ 8

Рабочее решение LINQ:

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

Ответ 9

 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);

Ответ 10

или, с регулярным выражением.

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;

с примером .

Вы можете решить, может ли его перебор.

или

как проверенный метод расширения

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;
    }
}

Ответ 11

Поскольку : и - уникальны, вы можете использовать:

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];

Ответ 12

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

Это возвращает только значения (-ы) между "ключом" и следующим случаем "-"

Ответ 13

Я использовал фрагмент кода от Виджая Сингха Раны, который в основном выполняет эту работу. Но это вызывает проблемы, если firstString уже содержит lastString. Я хотел извлечь access_token из ответа JSON (не загружен анализатор JSON). Мой firstString был \"access_token\": \", а мой lastString был \". Я закончил с небольшой модификацией

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);
}

Ответ 14

Вы можете использовать метод расширения ниже:

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;
    }

Использование:

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

Ответ 15

Если вы ищете 1-строчное решение, вот оно:

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

Целое 1-строчное решение с 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());
    }
}

Ответ 16

У вас уже есть хорошие ответы, и я понимаю, что код, который я предоставляю, далек от самого эффективного и чистого. Однако я подумал, что это может быть полезно для образовательных целей. Мы можем использовать готовые классы и библиотеки в течение всего дня. Но, не понимая внутренней работы, мы просто имитируем и повторяем и никогда не узнаем ничего. Этот код работает и является более простым или "девственным", чем некоторые другие:

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;
}

В итоге вы получите нужную строку, назначенную переменной parsedString. Имейте в виду, что он также будет захватывать начальные и предыдущие пробелы. Помните, что строка - это просто массив символов, которые можно манипулировать, как и другие массивы с индексами и т.д.

Позаботьтесь.

Ответ 17

Как я всегда говорю, ничего невозможного:

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);
}

Примечание, которое должно добавить ссылку System.Text.RegularExpressions

Надеюсь, что я помог.

Ответ 18

С помощью dotnetcore 3.0 вы можете

var s = "header-THE_TARGET_STRING.7z";
var from = s.IndexOf("-") + "-".Length;
var to = s.IndexOf(".7z");
var versionString = f[from..to];  // THE_TARGET_STRING