2012-05-22 6 views
35

Come posso trovare un testo all'interno di una stringa? Dopo di ciò, mi piacerebbe creare una nuova stringa tra questo e qualcos'altro. Per esempio ...Trova il testo nella stringa con C#

Se la stringa è stata:

This is an example string and my data is here 

e voglio creare una stringa con tutto ciò che è tra il "mio" e "è" come potrei farlo? Spiacente, questo è piuttosto pseudo, ma speriamo che abbia senso.

+1

Look at [** 'IndexOf' **] (http://msdn.microsoft.com/en-us/library/k8b1470s.aspx) e [** 'Sottostringa' **] (http://msdn.microsoft.com/en-us/library/aka44szs.aspx). – mellamokb

+1

possibile duplicato di [Trova parola/e tra due valori in una stringa] (http: // stackoverflow.it/questions/8082103/find-words-between-two-values-in-a-string) –

+0

Questa è una funzione Trova e sostituisci in una che stai cercando. Non è solo una ricerca, che IndexOf() o string.Contains() potrebbe facilmente gestire. – Fandango68

risposta

97

Utilizzare questa funzione.

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

Come si usa:

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

Non posso dire quanto sia utile la tua funzione breve - grazie. – Sabuncu

+0

Ma trova solo la parola (s) tra due altre parole. Dov'è il componente sostitutivo, che l'OP ha chiesto? – 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

Se si sa che si vuole sempre la stringa tra "mio" ed "è", allora si può sempre eseguire le seguenti operazioni:

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

Si potrebbe utilizzare Regex:

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

Questa è la modo più semplice:

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

Questa non è affatto una soluzione al problema. Perché questo è upvoted? – MichelZ

+11

Perché è la soluzione che stavo cercando per il mio problema (che è diverso dal problema dell'OP.). Accade solo che Google mi abbia portato su questa pagina quando ho cercato il mio problema. –

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

caso peggiore serach –

2

si può fare in questo modo compatto:

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

Questa è la risposta vera e corretta a ciò che l'OP chiedeva: una funzione Trova e sostituisci in uno. – Fandango68

1

Tranne @ risposta di Prashant, le risposte di cui sopra sono state esaudite in modo non corretto. Dov'è la funzione "sostituisci" della risposta? L'OP ha chiesto, "Dopo ciò, mi piacerebbe creare una nuova stringa tra questo e qualcos'altro".

Sulla base dell'ottima risposta di @ Oscar, ho ampliato la sua funzione in una funzione "Search And Replace" in una.

Penso che la risposta di @ Prashant avrebbe dovuto essere la risposta accettata dall'OP, poiché sostituisce.

In ogni caso, ho chiamato la mia variante - 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; 
    } 
} 
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

Ecco la mia funzione utilizzando la funzione di Oscar Jara come modello.

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

Questa versione esegue al massimo due ricerche del testo. Evita un'eccezione generata dalla versione di Oscar durante la ricerca di una stringa di fine che si verifica solo prima della stringa iniziale, ovvero getBetween(text, "my", "and");.

utilizzo è lo stesso:

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


    } 












     }