programing

문자열의 두 문자열 사이에 문자열 가져오기

magicmemo 2023. 8. 9. 20:40
반응형

문자열의 두 문자열 사이에 문자열 가져오기

다음과 같은 문자열이 있습니다.

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

나는 그냥 그 사이에 있는 끈을 유지하고 싶습니다."key : "그리고." - " 좋을까요?내가 어떻게 그럴 수 있을까?Regex를 사용해야 합니까 아니면 다른 방법으로 사용할 수 있습니까?

아마도, 좋은 방법은 단지 부분 문자열을 잘라내는 것입니다.

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

정규식 없이도 할 수 있습니다.

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

제가 그것을 할 수 있는 방법이 여기 있습니다.

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

구현이 얼마나 강력하고 유연한지에 따라 이는 실제로 다소 까다로울 수 있습니다.제가 사용하는 구현은 다음과 같습니다.

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 "

효과가 있을 것 같습니다.

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

작동하는 LINQ 솔루션:

string str = "super example 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

정규군은 여기서 과잉 살상입니다.

사용할 수 있습니다.string.Splitstring[]구분자를 위한 것이지만 그것은 또한 과잉 살상이 될 입니다.

및 - 전자를 확인하여 주어진 문자열의 일부를 가져오고 색인화하며 내부 문자열/문자의 색인화된 부분을 찾기 위한 길이와 두 번째를 가져옵니다.

연산자 C# 8.0을 사용할 수 있습니다...에 있어서와 같이

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

자세한 내용은 설명서를 참조하십시오.

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

또는 정규식과 함께.

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

: 리고그고.-고유한 기능을 사용할 수 있습니다.

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

저는 Vijay Singh Rana의 코드 스니펫을 사용했습니다. 기본적으로 그 일을 합니다.하지만 그것은 문제를 일으킵니다.firstString 이포되있다습니어가 되어 있습니다.lastString제가 원했던 것은 JSON 응답(JSON 파서가 로드되지 않음)에서 access_token을 추출하는 것이었습니다.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);
}

아래의 확장 방법을 사용할 수 있습니다.

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 : ", " - ");
var matches = Regex.Matches(input, @"(?<=key :)(.+?)(?=-)");

"key:"와 "-" 사이의 값만 반환합니다.

한 줄 솔루션을 찾고 있는 경우 다음과 같습니다.

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());
    }
}
  private string gettxtbettwen(string txt, string first, string last)
    {

        StringBuilder sb = new StringBuilder(txt);
        int pos1 = txt.IndexOf(first)  + first.Length;
        int len = (txt.Length ) - pos1;

        string reminder = txt.Substring(pos1, len);


        int pos2 = reminder.IndexOf(last) - last.Length +1;


       



        return reminder.Substring(0, pos2); 



    }

질문이 하나의 예로 언급될 때, 필연적으로 모호성이 존재합니다.이 질문도 예외는 아닙니다.

질문에 제시된 예에서 원하는 문자열은 다음과 같습니다.

super example of string key : text I want to keep - end of my string
                              ^^^^^^^^^^^^^^^^^^^

그러나 이 문자열은 특정 하위 문자열을 식별해야 하는 문자열 및 경계 문자열의 예에 불과합니다.다음과 같이 표현되는 제네릭 경계 문자열을 포함하는 제네릭 문자열을 고려하겠습니다.

abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
             ^^^^^^^^^^^^         ^^^^^  

PP의 문자열입니다.FF는 어떤 (, 는 다 문 질 모 일 문 하 나 을 니 냅 타 열 다 서 예 에 자 의 킬 위 시 문 치 는 음 자 파 자 티 열 이 며 질 ▁( )key : 는 앞의 문자열이고-는 다음 문자열입니다.)라고 추측해 왔습니다.PP그리고.FF단어 경계 앞과 뒤에 나옵니다.PPA그리고.FF8일치하지 않음).

파티 모자에 반영된 저의 가정은 다음과 같습니다.

  • 첫 번째 하위 문자열PP하나 이상이 앞에 올 수 있습니다.FF서브스트링(존재하는 경우 무시됨)
  • 한다면PP다음에 하나 이상이 나옵니다.PP전에FF다음이 발생했습니다.PPs는 앞 문자열과 뒤 문자열 사이의 부분 문자열의 일부입니다.
  • 한다면PP다음에 하나 이상이 나옵니다.FFa 앞에PP첫 번째는 만남입니다.FF다음에 나오는PP는 다음 문자열로 간주됩니다.

여기서 대부분의 답변은 양식의 문자열만 다룬다는 점에 유의하십시오.

abc PP def FF ghi
      ^^^^^

또는

abc PP def FF ghi PP jkl FF mno
      ^^^^^         ^^^^^

하나는 정규식, 코드 구조 또는 둘의 조합을 사용하여 관심 하위 문자열을 식별할 수 있습니다.나는 어떤 접근법이 최선인지에 대해 판단하지 않습니다.관심있는 서브스트링과 일치하는 아래의 정규 표현만 제시하겠습니다.

(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)

시동을 걸어요!1

PCRE(PHP) 정규식 엔진으로 테스트해 보았지만 정규식이 전혀 이국적이지 않기 때문에 에서 작동할 것이라고 확신합니다.NET 정규식 엔진(매우 견고함)

정규식 엔진은 다음과 같은 작업을 수행합니다.

(?<=          : begin a positive lookbehind
  \bPP\b      : match 'PP'
)             : end positive lookbehind
(?:           : begin a non-capture group
  (?!         : begin a negative lookahead
    \bFF\b    : match 'FF'
  )           : end negative lookahead
  .           : match any character
)             : end non-capture group
*             : execute non-capture group 0+ times
(?=           : begin positive lookahead
   \bFF\b     : match 'FF'
)             : end positive lookahead

한 번에 하나의 문자를 일치시키는 이 기술은, 앞의 문자열에 이어, 문자가 다음과 같을 때까지.F그리고 그 뒤입니다.F(또는 더 일반적으로 다음 문자열을 구성하는 문자열인 문자)을 강화된 탐욕 토큰 솔루션이라고 합니다.

당연히 위에서 설명한 가정이 변경되면 정규식을 수정해야 합니다(가능하다면).

자세한 설명을 보려면 커서를 이동합니다.

문자열 사이의 문자열을 잊어버리려면 다음 방법을 사용합니다.

public static class Extension
{
    /// <summary>
    /// Gets currently string between
    /// </summary>
    /// <param name="word">Currently string</param>
    /// <param name="start">String left</param>
    /// <param name="end">String right</param>
    /// <returns>String between start and end</returns>
    /// <example>The string "value (4815162342)" use Between("(",")") generates in method: "4815162342"</example>
    public static string Between(this string word, string start, string end)
    {
        if (start.Equals(end))
            throw new ArgumentException("Start string can't equals a end string.");

        int startIndex = word.LastIndexOf(start) + 1;
        int endIndex = word.LastIndexOf(end) - 1 - word.LastIndexOf(start);

        return word.Substring(startIndex, endIndex);
    }
}

여러 하위 문자열 쌍을 처리하려면 ReGEx 없이는 쉽지 않습니다.

Regex.Matches(input ?? String.Empty, "(?=key : )(.*)(?<= - )", RegexOptions.Singleline);
  • input ?? String.Empty인수 null 예외를 피합니다.
  • ?=1번째 하위 문자열을 유지하고 있습니다.?<=2번째 하위 문자열을 유지합니다.
  • RegexOptions.Singleline부분 문자열 쌍 사이의 새 줄 허용

서브스트링의 순서와 발생 횟수가 문제가 되지 않는다면, 이 빠르고 더러운 것이 옵션이 될 수 있습니다.

var parts = input?.Split(new string[] { "key : ", " - " }, StringSplitOptions.None);
string result = parts?.Length >= 3 ? result[1] : input;

적어도 일치하는 하위 문자열이 없는 경우 원래 문자열을 반환하여 대부분의 예외를 방지합니다.

당신은 이미 몇 가지 좋은 답변을 가지고 있으며 제가 제공하는 코드가 가장 효율적이고 깨끗하지 않다는 것을 알고 있습니다.하지만, 저는 그것이 교육적인 목적으로 유용할 수도 있다고 생각했습니다.우리는 하루 종일 미리 만들어진 수업과 도서관을 이용할 수 있습니다.그러나 내면의 작용을 이해하지 못하면, 우리는 단순히 모방하고 반복할 뿐이며 결코 아무것도 배우지 못할 것입니다.이 코드는 다른 코드보다 더 기본적이거나 "버진"입니다.

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

원하는 문자열이 parseString 변수에 할당됩니다.또한 진행 중인 공간과 이전 공간도 캡처됩니다.문자열은 인덱스 등을 사용하여 다른 배열처럼 조작할 수 있는 문자 배열입니다.

몸조심하세요.

제가 항상 말했듯이 불가능은 없습니다.

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

시스템에 대한 참조를 추가해야 합니다.텍스트.정규식

제가 도와줬기를 바랍니다.

아마도 이런 것.

private static string Between(string text, string from, string to)
{
    return text[(text.IndexOf(from)+from.Length)..text.IndexOf(to, text.IndexOf(from))];
}
getStringBetween(startStr, endStr, fullStr) {
    string startIndex = fullStr.indexOf(startStr);
    string endIndex= fullStr.indexOf(endStr);
    return fullStr.substring(startIndex + startStr.length, endIndex);
}

여기 있습니다;

 /// <summary>
    /// 
    /// </summary>
    /// <param name="line"></param>
    /// <param name="begin_tag"></param>
    /// <param name="end_tag"></param>
    /// <param name="lastIndexOfEndTag"></param>
    /// <returns></returns>
    private string getBetween(string line, string begin_tag, string end_tag, bool lastIndexOfEndTag = false, bool returnNullIfTagsNotExists = false)
    {
        if (!string.IsNullOrEmpty(line) && !string.IsNullOrEmpty(begin_tag) && !string.IsNullOrEmpty(end_tag))
        {
            //          1         2         3         4         5         6         7
            //0123456789012345678901234567890123456789012345678901234567890123456789012
            //StdErrorData:   Duration: 01:59:54.88, start: 0.000000, bitrate: 557 kb/s
            int startIndex = line.IndexOf(begin_tag);
            if (startIndex >= 0)
            {
                startIndex += begin_tag.Length;
            }
            else
            {
                if (returnNullIfTagsNotExists)
                {
                    return null;
                }
                else
                {
                    startIndex = 0;
                }
            }
            int endIndex = lastIndexOfEndTag ?
                line.LastIndexOf(end_tag, startIndex)
                : line.IndexOf(end_tag, startIndex);
            if (endIndex > startIndex)
            {
                return line.Substring(startIndex, endIndex - startIndex);
            }
            else
            {
                if (returnNullIfTagsNotExists)
                {
                    return null;
                }
                else
                {
                    return line.Substring(startIndex);
                }
            }
        }
        return null;
    }

테스트;

string r = getBetween("StdErrorData:   Duration: 01:59:54.88, start: 0.000000, bitrate: 557 kb/s", "Duration:", ",");
Console.WriteLine($"<{r}>");
//< 01:59:54.88>

시작 텍스트와 끝 텍스트를 보관하는 데 관심이 있는 사용자를 위한 확장 방법이 여기 있습니다.

public static string SubstringBetween(this string text, string start, string end, bool keepStartEndText = false)
    {
        var startIndex = text.IndexOf(start);
        var endIndex = text.LastIndexOf(end);

        if (keepStartEndText)
            return text.Substring(startIndex, (endIndex + end.Length) - startIndex);
        else
            return text.Substring(startIndex + start.Length, endIndex - (startIndex + start.Length));
    }
    public static string ExtractBetweenTwoStrings(string FullText, string StartString, string EndString, bool IncludeStartString, bool IncludeEndString)
    {
        try { int Pos1 = FullText.IndexOf(StartString) + StartString.Length; int Pos2 = FullText.IndexOf(EndString, Pos1); return ((IncludeStartString) ? StartString : "") 
                + FullText.Substring(Pos1, Pos2 - Pos1) + ((IncludeEndString) ? EndString : ""); } catch (Exception ex) { return ex.ToString(); } //return ""; }
    }

신용 거래처: https://www.c-sharpcorner.com/blogs/how-to-extract-a-string-lies-between-two-strings-in-c-sharpnet1

언급URL : https://stackoverflow.com/questions/17252615/get-string-between-two-strings-in-a-string

반응형