在另一个字符串中查找 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;
}
}
}
我找到了很多与此问题类似的帖子,但似乎找不到真正适合我的帖子。
我想检查 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;
}
}
}