从字符串中删除所有未指定的子字符串

时间:2019-04-19 15:29:51

标签: c# string

我有一个包含子字符串的多个实例以及其他文本的字符串。子字符串通过以给定的字母序列(例如CNTY)开头和以双斜杠(//)结尾的方式指定。如何有效删除所有不在指定子字符串内的文本?谢谢您的帮助。我发现此Regex将返回所需的结果:

string result = Regex.Matches(text, "CNTY(.*)//").Cast<Match>().Aggregate("", (s, t) => s + t.Value, s => s);

但是,我还有另一个更复杂的子字符串,它以WEATHLOC开头,然后在多行中包含通配符文本,并以RMKS,更多通配符文本和//开始。这是一个示例:

WEATHLOC / ICAO:KCOS // OBSTIME / 052005Z // 风/ 360/10 // VSBY / 10 / SM // CLDLYR /-/ LYR:BKN // TEMP / MAXTEMP:15 / MINTEMP:18 // 奥特斯/HG:29.92// RMKS /样本//

从WEATHLOC到最终//的所有内容都需要捕获,我只能依靠其以WEATHLOC开头和以RMKS * //结尾的内容。有没有办法在正则表达式比赛中表达这一点?

2 个答案:

答案 0 :(得分:1)

这应该有效:

string text = "hiCNTYhello//content What /-CNTYworld//12texCNTY!//That's it";
string search = "CNTY(.*?)//";
MatchCollection matches = Regex.Matches(text, search);

将匹配“ hello”,“ world”和“!”

答案 1 :(得分:-1)

此小代码段有效。 RegEx方法对我来说太困难了,但这确实可行。我们正在尝试检查是否在CNTY范围内//并将该文本输出到StringBuilder。

static void Main(string[] args)
{
    var input = @"CNTYTestingTesting//This is some more test CNTY1234//And some moreCNTYWhat is this?//";
    var sb = new StringBuilder();
    int inCnty = -1;

    for (int i = 0; i < input.Length; i ++)
    {
        // Test for start
        if (i < input.Length - 4)
        {
            if (input.Substring(i, 4) == "CNTY")
            {
                inCnty = i + 4; // Index of first CNTY
            }
        }

        // Test for end
        if (i < input.Length - 1)
        {
            if (input.Substring(i, 2) == @"//")
            {
                inCnty = -1; // Reset
            }
        }

        // Test if we are in the segment
        if (i >= inCnty && inCnty > 0)
        {
            // Outside string
            sb.Append(input[i]);
        }

    }

    var output = sb.ToString();
    Console.WriteLine(output);
    Console.Read();
}