Жолда екі жол арасындағы жолды алыңыз

Менің жолым бар:

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

Мен жай ғана «кілтінің:» және «-» арасындағы жолды сақтағыңыз келеді. Мұны қалай жасауға болады? Мен Regex-ды қолдансам не оны басқаша жасай аламын ба?

59
substring және indexof пайдаланыңыз
қосылды автор Sayse, көзі
Жолды белгілі жолдан кейін жолды және бұрынғы жол кірген жолда қамтылған басқа арнайы жолға дейін алыңыз.
қосылды автор Ken Kin, көзі

15 жауаптар

Мүмкін, жақсы жол тек қана субстрейді қиып алу:

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);
89
қосылды
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);
25
қосылды

Сіз мұны региссіз жасауға болады

 input.Split(new string[] {"key :"},StringSplitOptions.None)[1]
      .Split('-')[0]
      .Trim();
18
қосылды

Өзіңіздің орындауыңыздың қаншалықты сенімді/икемді болуына байланысты, бұл шын мәнінде біраз қиын болуы мүмкін. Мен қолданамын:

public static class StringExtensions {
    /// 
/// takes a substring between two anchor strings (or the end of the string if that anchor is null) ///
 
    /// 
a string
    /// 
an optional string to search after
    /// 
an optional string to search before
    /// 
an optional comparison for the search
    /// a substring based on the search
    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
қосылды
@Leon: сіз барлық мәдениетпен байланысты нәрселерді шығарып алуыңыз керек және .NET тек индекстің жұмыс істеуі үшін қолданыстағы мәдениетті қолданады. Мен Windows Universal бағдарламаларымен таныс емеспін, сондықтан мен сенімді айта алмаймын.
қосылды автор ChaseMedallion, көзі
@AdrianIftode: жақсы қоңырау. Бұл, әрине, қате болды. StartIndex бағдарламасындағы екінші якорьді іздеуді бастау маңызды, себебі ол бірінші якорьдің соңына жеткен. Мен осы жерде кодты тіркедім.
қосылды автор ChaseMedallion, көзі
InvariantCulture Windows Universal бағдарламаларымен жұмыс істемейді. Сіздің сыныптың функционалдығын сақтай отырып, оны жоюдың бір жолы бар ма? @ChaseMedallion
қосылды автор Leon, көзі
Мен сіздің кодты пайдаландыңыз, бірақ мен осыдан кейінгі «B» деген жолдардан @ this.IndexOf (дейін, startIndex + fromLength, салыстыру дейін) кішкентай қатені таптым, сондықтан мен Length-ден жойылдым. Мен оны терең сынамаған жоқпын
қосылды автор Adrian Iftode, көзі

Регекс - бұл жерде артықшылығы.

< артық болыңыз.

Substring және IndexOf - берілген жолдың бөліктерін және индексті және Ішкі жолдарды/таңбаларды индекстеу үшін ұзындығы және екіншісі.

10
қосылды
Бұл өте көп емес ... шын мәнінде Substring және IndexOf әдепсіз деп айтқым келеді. Мен бұл string.Split дұрыс деп айтқым келеді. Регекс - бұл өте көп.
қосылды автор It'sNotALie., көзі
Егер сіз regex жазуын білсеңіз ...
қосылды автор It'sNotALie., көзі
@Oded Oh right.
қосылды автор It'sNotALie., көзі
@newStackExchangeInstance - Менің ойымша, ол туралы string.Split .
қосылды автор Oded, көзі
Мақсаты өте жоғары немесе төмен өлтірілу болып табылады, себебі бұл жауапты Регекске қарағанда басқаша орындау туралы плакаттың өтінішіне жауап береді.
қосылды автор Karl Anderson, көзі
@newStackExchangeInstance: «-» алдында «кілт:» болса, ол ақталмайды. Ішкі сызық - нүкте.
қосылды автор jmoreno, көзі

Міне, мен мұны қалай істей аламын

   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
қосылды

Менің ойымша, бұл жұмыс:

   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
қосылды
Үлкен шешім. Рахмет!
қосылды автор arcee123, көзі

немесе регрессиямен.

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.Fнемесеmat("{0}(.*){1}", left, right))
            .Groups[1].Value;
    }
}
5
қосылды
 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
қосылды
Сіздің кодыңыз жаңа жолдың басында қос нүктенің қайтарылуына әкеледі.
қосылды автор tsells, көзі

Жұмыс 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
3
қосылды
Бұл бір таңбалы толтырғыштар үшін ғана жұмыс істей ме?
қосылды автор beppe9000, көзі
супер жеңіл шешім.
қосылды автор Erdinç, көзі

: және - бірегей болғандықтан, сіз оны пайдалана аласыз:

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
қосылды
Бұл жауап бұрыннан бар жауаптардың көп мөлшеріне ештеңе салмайды.
қосылды автор Mephy, көзі

Төмендегі кеңейтілім әдісін қолдануға болады:

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 : ", " - ");
2
қосылды

Сізде кейбір жақсы жауаптар бар және мен ұсынатын коды ең тиімді және таза емес екенін түсінемін. Алайда, менің ойымша, бұл білім беру мақсаттары үшін пайдалы болуы мүмкін деп ойладым. Бұрын салынған сыныптар мен кітапханаларды күні бойы пайдалануға болады. Дегенмен, ішкі істерді түсінбестен, біз тек қана қайталанатын және қайталайтын және ешқашан ештеңе үйренбейтін боламыз. Бұл код жұмыс істейді және басқалардан гөрі неғұрлым негізгі немесе «таза» болып табылады:

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 айнымалысына тағайындалған қажетті жолмен аяқталады. Есіңізде болсын, ол сондай-ақ алдыңғы және алдыңғы кеңістіктерді басып шығарады. Жолдың индексі бар басқа массивтер сияқты манипуляциялануы мүмкін таңбалардың массиві екенін ұмытпаңыз.

Өз-өзіңді күт.

1
қосылды
Мен түсіндім. Мен оның күшті және апталық ұпайларын көрсетіп жүрдім. Дегенмен, түпнұсқалық сұраққа жауап беру үшін, оны тек шекараның шекарасына емес, жол шекараларына сәйкестендіру қажет болғандықтан, ол біршама көп талап етеді. Бірақ идея бірдей.
қосылды автор Paulo Morgado, көзі
Бұл жолды жасаудағы ең нашар болса да, ең жақсы алгоритм болып табылады. Тек қана regex емес, барлық жауаптар жолды құруда бақытты, бірақ бұл - барлық мағынада ең нашар. Егер сіз жай ғана жолдың соңын ұстап алып, оны алу үшін '' string.Substring '' пайдаланған болсаңыз, бұл өте жақсы болар еді.
қосылды автор Paulo Morgado, көзі
Мен келісемін. Мен айтқанымдай, бұл тиімді емес. Мен бұл алгоритмді пайдалануды ұсынбаймын. Бұл жай ғана «төменгі деңгейде» сызықтарды түсінуге мүмкіндік береді «, егер ол жай ғана жұмысқа жетуді қаласа, ол оған қол жеткізетін жауаптар алды.
қосылды автор flyNflip, көзі
Мүлдем. Сіз мақсатқа сайсыз.
қосылды автор flyNflip, көзі

Мен әрдайым ештеңе айта алмаймын:

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 сілтемесін қосатын ескерту

Мен көмектестім деп үміттенемін.

0
қосылды
var matches = Regex.Matches(input, @"(?<=key :)(.+?)(?=-)");

Бұл тек «кілт:» және «-»

0
қосылды