Suchen Sie Text in einer Zeichenfolge mit C #


77

Wie kann ich einen bestimmten Text in einer Zeichenfolge finden? Danach möchte ich eine neue Zeichenfolge zwischen dieser und etwas anderem erstellen. Zum Beispiel, wenn die Zeichenfolge war:

This is an example string and my data is here

Und ich möchte eine Zeichenfolge mit dem Wert zwischen "mein" und "ist" erstellen. Wie kann ich das tun? Das ist ziemlich pseudo, aber hoffentlich macht es Sinn.


2
Schau dir an IndexOfund Substring.
Mellamokb


Dies ist sowohl eine Such- als auch eine Ersetzungsfunktion in einer, nach der Sie suchen. Es ist nicht nur ein Fund, den IndexOf () oder string.Contains () leicht verarbeiten können.
Fandango68

Wenn Sie hierher gekommen wie eine verrückte Person das Gefühl , weil Ihre UWP App Quelle ließ nicht Sie zugreifen stringoder String‚s .Contains()und nur .Concat...Optionen, speichern, schließen Neustart, und sparen Sie sich einige Elend.
KayleeFrye_onDeck

Antworten:


179

Verwenden Sie diese Methode:

public static string getBetween(string strSource, string strStart, string strEnd)
{
    if (strSource.Contains(strStart) && strSource.Contains(strEnd))
    {
        int Start, End;
        Start = strSource.IndexOf(strStart, 0) + strStart.Length;
        End = strSource.IndexOf(strEnd, Start);
        return strSource.Substring(Start, End - Start);
    }

    return "";
}

Wie man es benutzt:

string source = "This is an example string and my data is here";
string data = getBetween(source, "my", "is");

4
Ich kann Ihnen nicht sagen, wie nützlich Ihre Kurzfunktion ist - danke.
Sabuncu

Es werden jedoch nur die Wörter zwischen zwei anderen Wörtern gefunden. Wo ist die Ersatzkomponente, nach der das OP gefragt hat?
Fandango68

Gute Funktion und auch eine positive Bewertung! Bitte geben Sie in Ihrem Beispiel an, auf welche Ausgabe andere verweisen sollen :)
Gareth

Tolle Funktion! Bitte ändern Sie die lokalen Variablennamen, um mit Kleinbuchstaben zu beginnen. Sie können auch ändern strSource.IndexOf(strStart, 0)zu strSource.IndexOf(strStart). Sie müssen nicht deklarieren int start, end, Sie können einfach schreibenint start = strSource.IndexOf....
BornToCode

68

Dies ist der einfachste Weg:

if(str.Contains("hello"))

25
Dies ist überhaupt keine Lösung für das Problem. Warum ist das positiv bewertet?
MichelZ

22
Weil es die Lösung ist, nach der ich für mein Problem gesucht habe (was sich vom OP-Problem unterscheidet). Es ist einfach so, dass Google mich auf diese Seite gebracht hat, als ich nach meinem Problem gesucht habe.
Davide Andrea

5
Ja, aber die Antworten beziehen sich auf das Problem des OP, nicht auf zufällige
Dinge

1
Zustimmen. Außerdem habe ich auf Google nach etwas ähnlichem wie der ursprünglichen Post-Frage gesucht, bin auf diese Seite gekommen und war durch diese Antwort verwirrt, nach der ich nicht suche.
Fabio Strocco

28

Sie könnten Regex verwenden:

var regex = new Regex(".*my (.*) is.*");
if (regex.IsMatch("This is an example string and my data is here"))
{
    var myCapturedText = regex.Match("This is an example string and my data is here").Groups[1].Value;
    Console.WriteLine("This is my captured text: {0}", myCapturedText);
}

8
 string string1 = "This is an example string and my data is here";
 string toFind1 = "my";
 string toFind2 = "is";
 int start = string1.IndexOf(toFind1) + toFind1.Length;
 int end = string1.IndexOf(toFind2, start); //Start after the index of 'my' since 'is' appears twice
 string string2 = string1.Substring(start, end - start);

5

Hier ist meine Funktion mit Oscar Jaras Funktion als Modell.

public static string getBetween(string strSource, string strStart, string strEnd) {
   const int kNotFound = -1;

   var startIdx = strSource.IndexOf(strStart);
   if (startIdx != kNotFound) {
      startIdx += strStart.Length;
      var endIdx = strSource.IndexOf(strEnd, startIdx);
      if (endIdx > startIdx) {
         return strSource.Substring(startIdx, endIdx - startIdx);
      }
   }
   return String.Empty;
}

Diese Version führt höchstens zwei Suchvorgänge im Text durch. Es vermeidet eine Ausnahme, die von Oskars Version ausgelöst wird, wenn nach einer Endzeichenfolge gesucht wird, die nur vor der Startzeichenfolge auftritt, d. H.getBetween(text, "my", "and"); . H.

Die Verwendung ist die gleiche:

string text = "This is an example string and my data is here";
string data = getBetween(text, "my", "is");

4

Sie können es kompakt so machen:

string abc = abc.Replace(abc.Substring(abc.IndexOf("me"), (abc.IndexOf("is", abc.IndexOf("me")) + 1) - abc.IndexOf("size")), string.Empty);

Dies ist die wahre und richtige Antwort auf die Fragen des OP - eine Funktion zum Suchen und Ersetzen in einem.
Fandango68

4

Mit Ausnahme der Antwort von @ Prashant wurden die obigen Antworten falsch beantwortet. Wo ist die "Ersetzen" -Funktion der Antwort? Das OP fragte: "Danach möchte ich eine neue Zeichenfolge zwischen dieser und etwas anderem erstellen."

Aufgrund der hervorragenden Resonanz von @ Oscar habe ich seine Funktion zu einer "Search And Replace"Funktion in einer erweitert.

Ich denke, die Antwort von @ Prashant hätte die vom OP akzeptierte Antwort sein sollen, da sie ersetzt.

Jedenfalls habe ich meine Variante angerufen - ReplaceBetween().

public static string ReplaceBetween(string strSource, string strStart, string strEnd, string strReplace)
{
    int Start, End;
    if (strSource.Contains(strStart) && strSource.Contains(strEnd))
    {
        Start = strSource.IndexOf(strStart, 0) + strStart.Length;
        End = strSource.IndexOf(strEnd, Start);
        string strToReplace = strSource.Substring(Start, End - Start);
        string newString = strSource.Concat(Start,strReplace,End - Start);
        return newString;
    }
    else
    {
        return string.Empty;
    }
}

3
  string WordInBetween(string sentence, string wordOne, string wordTwo)
        {

            int start = sentence.IndexOf(wordOne) + wordOne.Length + 1;

            int end = sentence.IndexOf(wordTwo) - start - 1;

            return sentence.Substring(start, end);


        }

3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;

namespace oops3
{


    public class Demo
    {

        static void Main(string[] args)
        {
            Console.WriteLine("Enter the string");
            string x = Console.ReadLine();
            Console.WriteLine("enter the string to be searched");
            string SearchText = Console.ReadLine();
            string[] myarr = new string[30];
             myarr = x.Split(' ');
            int i = 0;
            foreach(string s in myarr)
            {
                i = i + 1;
                if (s==SearchText)
                {
                    Console.WriteLine("The string found at position:" + i);

                }

            }
            Console.ReadLine();
        }


    }












        }

2
static void Main(string[] args)
    {

        int f = 0;
        Console.WriteLine("enter the string");
        string s = Console.ReadLine();
        Console.WriteLine("enter the word to be searched");
        string a = Console.ReadLine();
        int l = s.Length;
        int c = a.Length;

        for (int i = 0; i < l; i++)
        {
            if (s[i] == a[0])
            {
                for (int K = i + 1, j = 1; j < c; j++, K++)
                {
                    if (s[K] == a[j])
                    {
                        f++;
                    }
                }
            }
        }
        if (f == c - 1)
        {
            Console.WriteLine("matching");
        }
        else
        {
            Console.WriteLine("not found");
        }
        Console.ReadLine();
    }

2

Dies ist der richtige Weg, um einen Teil des Textes innerhalb einer Zeichenfolge zu ersetzen (basierend auf der getBetween-Methode von Oscar Jara):

public static string ReplaceTextBetween(string strSource, string strStart, string strEnd, string strReplace)
    {
        int Start, End, strSourceEnd;
        if (strSource.Contains(strStart) && strSource.Contains(strEnd))
        {
            Start = strSource.IndexOf(strStart, 0) + strStart.Length;
            End = strSource.IndexOf(strEnd, Start);
            strSourceEnd = strSource.Length - 1;

            string strToReplace = strSource.Substring(Start, End - Start);
            string newString = string.Concat(strSource.Substring(0, Start), strReplace, strSource.Substring(Start + strToReplace.Length, strSourceEnd - Start));
            return newString;
        }
        else
        {
            return string.Empty;
        }
    }

Das string.Concatverkettet 3 Strings:

  1. Der String-Quellteil vor dem zu ersetzenden String gefunden - strSource.Substring(0, Start)
  2. Die ersetzende Zeichenfolge - strReplace
  3. Der String-Quellteil nach dem zu ersetzenden String gefunden - strSource.Substring(Start + strToReplace.Length, strSourceEnd - Start)

0

Wenn Sie wissen, dass Sie immer die Zeichenfolge zwischen "my" und "is" möchten, können Sie immer Folgendes ausführen:

string message = "This is an example string and my data is here";

//Get the string position of the first word and add two (for it's length)
int pos1 = message.IndexOf("my") + 2;

//Get the string position of the next word, starting index being after the first position
int pos2 = message.IndexOf("is", pos1);

//use substring to obtain the information in between and store in a new string
string data = message.Substring(pos1, pos2 - pos1).Trim();

0

Finden Sie zuerst den Index des Textes und dann den Teilstring

        var ind = Directory.GetCurrentDirectory().ToString().IndexOf("TEXT To find");

        string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);

0

Fügen Sie einfach diesen Code hinzu:

if (string.Contains ("search_text")) {MessageBox.Show ("Message."); }}


2
Willkommen bei StackOverflow! Bitte beschreiben Sie, was Ihr Code tut, anstatt ihn nur einzufügen. Dadurch können zukünftige Besucher mit der gleichen Frage verstehen, was sie tun sollen.
Hille
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.