2012-05-22 8 views
35

Wie kann ich den angegebenen Text innerhalb einer Zeichenfolge finden? Danach möchte ich eine neue Zeichenfolge zwischen dieser und etwas anderem erstellen. Zum Beispiel ...Suchen Sie Text in Zeichenfolge mit C#

Wenn die Zeichenfolge war:

This is an example string and my data is here 

Und ich möchte einen String mit schaffen, was zwischen „mein“ und „wird“, wie könnte ich das tun? Tut mir leid, das ist ziemlich pseudo, aber hoffentlich macht es Sinn.

+1

Blick auf [** 'IndexOf' **] (http://msdn.microsoft.com/en-us/library/k8b1470s.aspx) und [** 'Substring' **] (http://msdn.microsoft.com/en-us/library/aka44szs.aspx). – mellamokb

+1

mögliches Duplikat von [Find Wort (e) zwischen zwei Werten in einer Zeichenfolge] (http: // stackoverflow.com/questions/8082103/find-words-between-two-values-in-a-string) –

+0

Dies ist sowohl eine Suchen und Ersetzen-Funktion in einem, die Sie suchen. Es ist nicht nur eine Suche, die IndexOf() oder string.Contains() leicht verarbeiten könnte. – Fandango68

Antwort

97

Verwenden Sie diese Funktion.

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

Wie man es verwendet:

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

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

+0

Aber es findet nur das Wort (die Wörter) zwischen zwei anderen Wörtern. Wo ist die Ersatzkomponente, die das OP angefordert hat? – Fandango68

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

Wenn Sie wissen, dass Sie immer die Zeichenfolge zwischen „mein“ und wollen „ist“, dann können Sie immer folgende Aufgaben auszufü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(); 
18

könnten Sie 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); 
} 
36

Dies ist einfachste Weg:

if(str.Contains("hello")) 
+12

Dies ist keine Lösung für das Problem. Warum wird dies aufgewertet? – MichelZ

+11

Weil es die Lösung ist, nach der ich nach meinem Problem gesucht habe (was sich von OP's Problem unterscheidet). Zufällig hat Google mich auf diese Seite gebracht, als ich nach meinem Problem gesucht habe. –

1
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(); 
    } 
+0

worst case serach –

2

Sie können es so kompakt tun:

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

Dies ist die richtige und richtige Antwort auf das, was das OP gefragt hat - eine Funktion zum Suchen und Ersetzen in einem. – Fandango68

1

Außer @ Prashant Antwort, die oben genannten Antworten sind falsch beantwortet. Wo ist die "Ersetzen" -Funktion der Antwort? Das OP fragte: "Danach möchte ich eine neue Saite zwischen dieser und etwas anderem erstellen".

Basierend auf Oscars exzellenter Antwort, habe ich seine Funktion auf eine "Search And Replace" Funktion in einem erweitert.

Ich denke @ Prashants Antwort sollte die akzeptierte Antwort des OP gewesen sein, da es einen Ersatz gibt.

Wie auch immer, ich habe meine Variante - ReplaceBetween() genannt.

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


     } 
1

Hier ist meine Funktion Oscar Jara 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 macht höchstens zwei Suchen des Textes. Es vermeidet eine Ausnahme, die von Oscars Version ausgelöst wird, wenn nach einer Endzeichenfolge gesucht wird, die nur vor der Startzeichenfolge auftritt, d. H. getBetween(text, "my", "and");.

Verbrauch ist das gleiche:

string text = "This is an example string and my data is here"; 
string data = getBetween(text, "my", "is"); 
1
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(); 
     } 


    } 












     } 
Verwandte Themen