提取与每个字符串开头的模式匹配的字符串列表

本文关键字:字符串 模式匹配 列表 开头 提取 | 更新日期: 2023-09-27 17:51:05

我有一个很长的字符串,我想从中提取与每个字符串开头的模式匹配的字符串。例如,假设我有:

string TheLongString = Lorem ipsum "SomeWordOne" dolor sit "SomeWordTwo" amet;

如何从这个字符串中提取所有以引号开头的字符串?例如,在本例中,列表应该包含"SomeWordOne""SomeWordTwo"

提取与每个字符串开头的模式匹配的字符串列表

假设您正在搜索的模式不是单个单词(kd)。),您可以使用Regex匹配来做您想做的事情:

Regex regex = new Regex("'"SomeWord[^'"]*'"");
var matches = regex.Matches(TheLongString);
List<string> myMatchedStrings = new List<string>();
foreach (Match match in matches)
{
    myMatchedStrings.Add(match.Value);
}

如果你不希望双引号包含在你的结果中,使用下面的插入式替换,它使用Regex Look Behind来查找你的开始引号,但它实际上不会显示在结果中:

Regex regex = new Regex("(?<='")SomeWord[^'"]*");

或者即使你想从结果中排除"SomeWord":

Regex regex = new Regex("(?<='"SomeWord)[^'"]*");

这应该留下myMatchedStrings与你的模式的列表,只要模式开始和结束双引号,并以"SomeWord"开始,但你可以根据需要调整

第一步:您需要使用string.Split()方法基于Space分隔符对字符串进行split

步骤2:遍历所有单词,并使用string.StartsWith()方法识别是否有以字符串"SomeWord开头的单词。如果有,那么将它添加到List

试试这个:

string str="string TheLongString = Lorem ipsum '"SomeWordOne'" 
                            dolor sit '"SomeWordTwo'" amet;";
var words = str.Split(new []{' '},StringSplitOptions.RemoveEmptyEntries);
List<string> selectedWords = new List<string>();
foreach (var word in words)
{
    if (word.StartsWith("'"SomeWord"))
        selectedWords.Add(word);
}

EDIT:在注释中指出,如果您的someword包含空格,那么上述方法不适合

您可以重复使用IndexOf(使用带有startIndex参数的重载)和Substring,或者您可以使用正则表达式。

IndexOf的情况下,您只需搜索"SomeWord,然后找到一个结束引号,子字符串,并重复。

正则表达式看起来像这样:

'"(?<Inside>SomeWord[^'"]*)'"

var matches =长字符串。(' ')。Where(p => p. startswith ("SomeWord"));

我认为你需要一个自定义的拆分函数。@Sudhakar的答案应该有效,如果你的SomeWords不包含任何空格。但是如果是这样的话,你可以使用如下的扩展方法:

public static string[] SplitBy(this string source,char separator)
{
    var chars = source.ToCharArray();
    var temp = new List<char>();
    var words = new List<string>();
    bool splitControl = false;
    for (int i = 0; i < chars.Length; i++)
    {
        if (chars[i] == separator && !splitControl)
        {
           splitControl = true;
           continue;
        }
        else if (chars[i] == separator && splitControl)
        {
           words.Add(new string(temp.ToArray()));
           temp.Clear();
           splitControl = false;
           continue;
        }
        if(splitControl) temp.Add(chars[i]);
    }
    if(temp.Any()) words.Add(new string(temp.ToArray()));
    return words.ToArray();
}

这个函数返回所有被双引号括起来的单词。例如:

string TheLongString = "Lorem ipsum '"SomeWordOne'" dolor sit '"SomeWordTwo'" amet";
var result = TheLongString.SplitBy('"');

这将返回SomeWordOneSomeWordTwo,如果你想过滤返回的结果,你可以简单地使用LINQ:

var result = TheLongString.SplitBy('"').Where(x => x.StartsWith("SomeWord"));