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


77

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

This is an example string and my data is here

我想创建一个字符串,其中“ my”和“ is”之间应该是什么?这是很伪的,但希望它是有道理的。


2
看看IndexOfSubstring
mellamokb


这既是“查找”又是“替换”功能。这不仅仅是一个IndexOf()或string.Contains()可以轻松处理的发现。
Fandango68

如果您来这里时感觉像个疯子,因为您的UWP应用程序的源不允许您访问stringString.Contains()唯一.Concat...选项,请保存,关闭,重新启动并为自己节省一些痛苦。
kayleeFrye_onDeck

Answers:


179

使用此方法:

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
无法告诉您简短功能的实用性-谢谢。
Sabuncu

但是它只能在其他两个单词之间找到一个或多个单词。OP要求的替换组件在哪里?
Fandango68

功能不错,也很赞!请在您的示例中包括输出内容,以供他人参考:)
Gareth

功能强大!请更改本地变量名称以小写字母开头。您也可以更改strSource.IndexOf(strStart, 0)strSource.IndexOf(strStart)。您不必声明int start, end,只需编写即可int start = strSource.IndexOf....
BornToCode

68

这是最简单的方法:

if(str.Contains("hello"))

25
这根本不是解决问题的办法。为什么要反对?
MichelZ 2015年

22
因为这是我一直在寻找问题的解决方案(与OP的问题不同)。碰巧的是,当我搜索问题时,Google引导我进入了此页面。
Davide Andrea

5
是的,但是答案是关于OP的问题,而不是一些随机的东西... :)
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

这是我使用Oscar Jara函数作为模型的函数。

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

此版本最多可进行两次文本搜索。当搜索仅在开始字符串之前出现的结束字符串时,它避免了Oscar版本引发的异常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);

这是对OP提出的要求的真正正确答案-一键查找和替换功能。
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

这是替换字符串中的一部分文本的正确方法(基于Oscar Jara的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

如果您知道始终需要“ my”和“ is”之间的字符串,则可以始终执行以下操作:

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

只需添加以下代码:

如果(string.Contains(“ search_text”)){MessageBox.Show(“ Message。”); }


2
欢迎来到StackOverflow!请描述您的代码,而不只是粘贴代码。这样,将来有相同问题的访客就可以了解他们应该怎么做。
Hille
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.