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

时间:2014-03-20 16:51:00

标签: c#

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

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

如何从此字符串中提取所有引号中的字符串并以SomeWord开头?例如,在这种情况下,列表应包含"SomeWordOne""SomeWordTwo"

感谢。

5 个答案:

答案 0 :(得分:1)

第1步:您需要使用split方法Space基于string.Split()分隔符的字符串"SomeWord

第2步:迭代所有单词,并使用string.StartsWith()方法识别是否有任何单词以字符串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); }

试试这个:

someword
如果您的{{1}}包含空格,那么

编辑如评论中所示,则上述方法不适用。

答案 1 :(得分:1)

假设您要搜索的模式不是一个单词(kd.'s answer将适用于此),您可以使用正则表达式匹配来执行您想要的操作:

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查找您的开场报价,但实际上不会显示在结果中:< / p>

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

或者即使您想从结果中排除“SomeWord”:

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

这应该为myMatchedStrings留下你的模式列表,只要模式以双引号开头和结尾并以“SomeWord”开头,但你可以根据需要进行调整。

答案 2 :(得分:0)

好吧,您可以反复使用IndexOf(使用带startIndex参数的重载)和Substring,也可以使用正则表达式。

IndexOf案例中,您只需搜索"SomeWord,然后找到结束语,子串并重复。

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

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

答案 3 :(得分:0)

var matches = TheLongString.Split('')。Where(p =&gt; p.StartsWith(“SomeWord”));

答案 4 :(得分:0)

我认为您需要自定义分割功能。如果您的SomeWords不包含任何空格,@ Sudhakar的answer应该有效。但如果确实如此,你可以使用这样的扩展方法:

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