在另一个字符串中查找 string/word

Find a string/word inside another string

我找到了很多与此问题类似的帖子,但似乎找不到真正适合我的帖子。

我想检查 string str = "blablatestblabla" 是否包含 string str = "test"。 当存在完全匹配时,我可以使用它。否则失败。 我已经尝试了几种方法,例如;

Regex.IsMatch()
str.Contains()
IndexOf()

这段代码的目的是找到特定的字符串(精确匹配或字符串内匹配),将这个字符串添加到一个列表中,然后继续添加下面的字符串,直到找到第二个搜索字符串。

希望你能理解我的问题。

提前致谢!

编辑: 看起来很多人都无法理解我的要求,所以我会尽量让事情更清楚。

假设我有一个输入List<string>包含以下内容;

fail
fail
start //Exact match (search string 1)
data 1 
data 2
end //Exact match (search string 2)
fail 
fail 

fail 
fail 
junkstartjunk //Contains "start" within the string (search string 1)
data 3
data 4
junkendjunk //Contains "end" within the string (search string 2)
fail 
fail 

无论它是完全匹配还是包含匹配项 (junkstartjunk),我都无法找到搜索字符串 1 (start)。

我希望输出列表看起来像这样;

start
data 1
data 2
end

junkstartjunk
data 3
data 4
junkendjunk

到目前为止,这是我的代码:

public void FindAndRearrangeMsg(Converter converter)
    {
        List<string> txtInput = new List<string>();
        txtInput = converter.TxtInput; // Gets the user input.
        string strFindAndArrMsg1 = converter.StrFindAndArrMsg1; // Gets the first string to search for
        string strFindAndArrMsg2 = converter.StrFindAndArrMsg2; // Gets the second string to search for
        bool msg1Found = false; // Becomes TRUE if user's first string is found
        string newLine = "\n";

        foreach (string str in txtInput)
        {
            bool firstMsg = strFindAndArrMsg1.Contains(str); // User's first specific word
            bool secondMsg = strFindAndArrMsg2.Contains(str); // User's second specific word

            if (((!string.IsNullOrEmpty(str)) || (!string.IsNullOrWhiteSpace(str))) && firstMsg && msg1Found == false)
            {
                msg1Found = true;
                outputListData.Add(str.ToString()); // Add the first string
            }
            // Continue to add string between the first and the second search string.
            else if (!secondMsg && msg1Found) 
            {
                outputListData.Add(str.ToString());
            }
            //If the second search string and the first search string is found.
            else if (secondMsg && msg1Found)
            {
                outputListData.Add(str.ToString() + newLine);
                msg1Found = false;
            }
            else
            {
                msg1Found = false;
                continue;
            }
        }
    }

我相信我明白了。您想要遍历一些字符串列表并创建一个新列表,该列表是第一个列表的子集,仅包含那些索引大于或等于第一个列表中包含某个给定字符串的第一个字符串的条目,并继续重写值直到您在第一个列表中遇到一个包含第二个给定字符串的字符串。对吗?

如果是这样,那么我不会使用 foreach 循环,它不适合这项工作。请改用 2 while 循环(如果您不打算使用任何 LINQ 或其他)。

伪代码:

 
int i = 0;
int j = inputList.length;

// Keep ignoring list elements until we either out of bounds or found a match
while(i < j && !strFindAndArrMsg1.Contains(inputList[i])) {
 i += 1;
}

// inputList[i] - 1st item in the list that contains strFindAndArrMsg1

while(i < j && !strFindAndArrMsg2.Contains(inputList[i])) {
// keep adding values to the second list...
 i += 1;
}
// ...until we are either out ou bounds or found a second match.
// inputList[i] - 1st item in the list that contains strFindAndArrMsg2

取决于边缘情况(你想 include/exlude 第一个/第二个找到的元素)你可能需要调整 indexes/add 循环外的附加值。

看起来@Eatos 的问题陈述是正确的。但是用一个 foreach 循环来做似乎更干净。该问题只需要一点状态即可跟踪您是否在所需的部分内。

我认为作为迭代器更容易做到。

不清楚是希望输入字符串包含 start/end 序列还是 start/end 序列包含输入字符串。我在输入字符串包含 start/end.

的地方完成了它

我还假设您想要包含终止 start/end 行。如果这不是您想要的,修改起来应该很简单。

    static string[] TestData = new string[]
        {
            "one","randomtwotext","three","four","five","six","seven"
        };

    static void Main(string[] _)
    {
        const string start = "two";
        const string end = "six";

        var subset = GetBetween(TestData, start, end);

        foreach (var str in subset)
            Console.WriteLine(str);
    }

    static IEnumerable<string> GetBetween(IEnumerable<string> source, string start, string end)
    {
        bool inSequence = false;

        foreach (var str in source)
        {
            if (inSequence)
            {
                yield return str;

                if (str.Contains(end))
                    break;
            }
            else if(str.Contains(start))
            {
                yield return str;
                inSequence = true;
            }
        }
    }