用 C # 查找字符串中的文本

如何在字符串中找到给定的文本?在那之后,我想创建一个新的字符串介于该字符串和其他字符串之间。例如,如果字符串是:

This is an example string and my data is here

我想用“ my”和“ is”之间的字符串创建一个字符串我该怎么做呢?这是相当伪造的,但希望它是有意义的。

590392 次浏览
 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);

Use this method:

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

How to use it:

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

If you know that you always want the string between "my" and "is", then you can always perform the following:

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

You could use 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);
}

This is the simplest way:

if(str.Contains("hello"))
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();
}

You can do it compactly like this:

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

Except for @Prashant's answer, the above answers have been answered incorrectly. Where is the "replace" feature of the answer? The OP asked, "After that, I'd like to create a new string between that and something else".

Based on @Oscar's excellent response, I have expanded his function to be a "Search And Replace" function in one.

I think @Prashant's answer should have been the accepted answer by the OP, as it does a replace.

Anyway, I've called my variant - 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;
}
}
  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);




}

Here's my function using Oscar Jara's function as a model.

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

This version does at most two searches of the text. It avoids an exception thrown by Oscar's version when searching for an end string that only occurs before the start string, i.e., getBetween(text, "my", "and");.

Usage is the same:

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




}
























}

First find the index of text and then substring

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


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

This is the correct way to replace a portion of text inside a string (based upon the getBetween method by 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;
}
}

The string.Concat concatenates 3 strings:

  1. The string source portion before the string to replace found - strSource.Substring(0, Start)
  2. The replacing string - strReplace
  3. The string source portion after the string to replace found - strSource.Substring(Start + strToReplace.Length, strSourceEnd - Start)

Simply add this code:

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

I have different approach on ReplaceTextBetween() function.

public static string ReplaceTextBetween(this string strSource, string strStart, string strEnd, string strReplace)
{
if (strSource.Contains(strStart) && strSource.Contains(strEnd))
{
var startIndex = strSource.IndexOf(strStart, 0) + strStart.Length;


var endIndex = strSource.IndexOf(strEnd, startIndex);


var strSourceLength = strSource.Length;


var strToReplace = strSource.Substring(startIndex, endIndex - startIndex);


var concatStart = startIndex + strToReplace.Length;


var beforeReplaceStr = strSource.Substring(0, startIndex);


var afterReplaceStr = strSource.Substring(concatStart, strSourceLength - endIndex);


return string.Concat(beforeReplaceStr, strReplace, afterReplaceStr);
}


return strSource;
}

Correct answer here without using any pre-defined method.

    static void WordContainsInString()
{
int f = 0;
Console.WriteLine("Input the string");
string str = Console.ReadLine();
Console.WriteLine("Input the word to search");
string word = Console.ReadLine();
int l = str.Length;
int c = word.Length;


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

for .net 6 can use next code

public static string? Crop(string? text, string? start, string? end = default)
{
if (text == null) return null;


string? result;


var startIndex = string.IsNullOrEmpty(start) ? 0 : text.IndexOf(start);


if (startIndex < 0) return null;


startIndex += start?.Length ?? 0;


if (string.IsNullOrEmpty(end))
{
result = text.Substring(startIndex);
}
else
{
var endIndex = text.IndexOf(end, startIndex);


if (endIndex < 0) return null;


result = text.Substring(startIndex, endIndex - startIndex);
}


return result;
}