在 c# 中存在模式后,我想从一组字符串中获取子字符串

I want substring from set of string after a pattern exist in c#

我有 3 个字符串 ---

m60_CLDdet2_LOSS2CLF_060520469434_R0RKE_52_GU
m60_CLDdet2_LOSS2CLF_060520469434_R10KE_52_TCRER
m60_CLDdet2_LOSS2CLF_060520469434_R0HKE_52_NT

我想要 R0RKE_52_GU, R10KE_52_TCRER,R0HKE_52_NT

注意:m60_CLDdet2_LOSS2CLF_060520469434 是变化的,所以如果 R0RKER10KER0HKE 存在

,我想查找子字符串

I want to find substring if R0RKE or R10KE or R0HKE exists

此 LINQ 查询 returns 所需结果:

var strings=new[]{"m60_CLDdet2_LOSS2CLF_060520469434_R0RKE_52_GU","m60_CLDdet2_LOSS2CLF_060520469434_R10KE_52_TCRER","m60_CLDdet2_LOSS2CLF_060520469434_R0HKE_52_NT"};

string[] starts = { "R0RKE", "R10KE", "R0HKE" };
var result = strings
  .Select(str => new { str, match = starts.FirstOrDefault(s => str.IndexOf("_" + s) >= 0)})
  .Where(x => x.match != null)
  .Select(x => x.str.Substring(x.str.IndexOf(x.match)));

Console.Write(String.Join(",", result)); // R0RKE_52_GU,R10KE_52_TCRER,R0HKE_52_NT 

我建议为此使用正则表达式,它在模式匹配方面更加通用。

var matches = System.Text.RegularExpressions.Regex.Matches(text, @"(R0RKE|R10KE|R0HKE).*");

更新:添加了 .Any - 它简化了代码并且同样高效。

如果您只需要检查字符串数组中的三个字符串,您可以这样做:

    static string[] GetStrings(string[] dirty, string[] lookUpValues)
    {
        List<string> result = new List<string>();
        for (int i = 0; i < dirty.Length; i++) if (lookUpValues.Any(dirty[i].Contains)) result.Add(dirty[i]);            
        return result.ToArray();
    }

用法:string[] result = GetStrings(dirty, new[] {"R0RKE", "R10KE", "R0HKE"}); 您也可以按照其他人的建议使用 LINQ 查询和 Regex.Matches

我写成静态方法:

private static string TakeIt(string inputString)
{
    if (!Regex.IsMatch(inputString, "(R0RKE|R10KE|R0HKE)"))
    {
        return string.Empty;
    }

    var regex = new Regex(@"_");
    var occurances = regex.Matches(inputString);
    var index = occurances[3].Index + 1;
    return inputString.Substring(index, inputString.Length - index);
}

void Main()
{
    var string1 = "m60_CLDdet2_LOSS2CLF_060520469434_R0RKE_52_GU";
    var string2 = "m60_CLDdet2_LOSS2CLF_060520469434_R10KE_52_TCRER";
    var string3 = "m60_CLDdet2_LOSS2CLF_060520469434_R0HKE_52_NT";
    var string4 = "m60_CLDdet2_LOSS2CLF_060520469434_hhhhh";

    Console.WriteLine(TakeIt(string1));
    Console.WriteLine(TakeIt(string2));
    Console.WriteLine(TakeIt(string3));
    Console.WriteLine(TakeIt(string4));
}

希望对您有所帮助。