Знайти текст у рядку за допомогою C #


78

Як я можу знайти заданий текст у рядку? Після цього я хотів би створити новий рядок між цим і чимось іншим. Наприклад, якщо рядок був:

This is an example string and my data is here

І я хочу створити рядок із тим, що знаходиться між "моїм" та "є", як я міг це зробити? Це досить псевдо, але, сподіваюся, це має сенс.


2
Подивіться на IndexOfі Substring.
mellamokb


Це функція "Знайти" та "Замінити" у тій, яку ви шукаєте. Це не просто знахідка, з якою IndexOf () або рядок. Contens () міг би легко впоратися.
Fandango68

Якщо ви прийшли сюди , відчуваючи , як божевільний , тому що джерело вашого UWP додатки в не дозволяють отримати доступ stringабо String«s .Contains()і тільки .Concat...параметри, зберегти, закрити, перезавантаження, і зберегти себе деякі страждання.
kayleeFrye_onDeck

Відповіді:


182

Використовуйте цей метод:

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

Як користуватися ним:

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

4
Не можу сказати, наскільки корисна ваша коротка функція - дякую.
Сабунку

Але воно знаходить лише слова між двома іншими словами. Де знаходиться компонент заміни, про який запитав ОП?
Fandango68

Приємна функція, а також підтримка! Будь ласка, вкажіть у своєму прикладі, на який результат посилаються інші: :)
Гарет,

Чудова функція! Будь ласка, змініть імена локальних змінних, щоб почати з малого регістру. Ви також можете змінити strSource.IndexOf(strStart, 0)на strSource.IndexOf(strStart). Вам не потрібно заявляти int start, end, ви можете просто написатиint start = strSource.IndexOf....
BornToCode

69

Це найпростіший спосіб:

if(str.Contains("hello"))

25
Це зовсім не вирішення проблеми. Чому це проголосувало?
MichelZ,

22
Тому що це рішення, яке я шукав для своєї проблеми (яка відрізняється від проблеми OP). Так трапляється, що Google потрапив на цю сторінку, коли я шукав свою проблему.
Давіде Андреа

5
Так, але відповіді стосуються проблеми ОП, а не якихось випадкових речей ... :)
MichelZ

1
Погодьтеся. Плюс я шукав щось подібне до оригінального запитання про публікацію в google, потрапив на цю сторінку, і мене заплутала ця відповідь, яка не те, що я шукаю.
Fabio Strocco

28

Ви можете використовувати регулярний вираз:

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

Ось моя функція з використанням функції Оскара Джари як моделі.

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

Ця версія виконує щонайбільше два пошуки тексту. Це дозволяє уникнути винятків кинутих версії Оскара при пошуку кінця рядка , яка відбувається тільки перед рядком початку, тобто getBetween(text, "my", "and");.

Використання однакове:

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

4

Ви можете зробити це компактно так:

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

Це правдива і правильна відповідь на те, що запитував ОП - функція Знайти та замінити в одному.
Fandango68

4

За винятком відповіді @ Prashant, на вказані вище відповіді було дано неправильну відповідь. Де функція відповіді "замінити"? OP запитав: "Після цього я хотів би створити новий рядок між цим та чимось іншим".

Грунтуючись на чудовій реакції @ Oscar, я розширив його функцію, щоб стати "Search And Replace"функцією в одному.

Я думаю, що відповідь @ Prashant мала бути прийнятою відповіддю OP, оскільки вона замінює.

У будь-якому випадку, я назвав свій варіант - 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

Це правильний спосіб замінити частину тексту всередині рядка (на основі методу getBetween Оскара Джари):

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

string.ConcatПриєднує 3 рядки:

  1. Частина джерела рядка перед рядком для заміни знайдено - strSource.Substring(0, Start)
  2. Замінюючий рядок - strReplace
  3. Частина джерела рядка після рядка для заміни знайдено - strSource.Substring(Start + strToReplace.Length, strSourceEnd - Start)

0

Якщо ви знаєте, що вам завжди потрібен рядок між "мій" та "є", ви завжди можете виконати наступне:

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

Спочатку знайдіть індекс тексту, а потім підрядок

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

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

0

Просто додайте цей код:

if (string.Contains ("search_text")) {MessageBox.Show ("Повідомлення."); }


2
Ласкаво просимо до StackOverflow! Будь ласка, опишіть, що робить ваш код, а не просто вставляйте його. На цьому майбутні відвідувачі з тим самим питанням можуть зрозуміти, що їм робити.
Hille
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.