在 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
是变化的,所以如果 R0RKE
或 R10KE
或 R0HKE
存在
,我想查找子字符串
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));
}
希望对您有所帮助。
我有 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
是变化的,所以如果 R0RKE
或 R10KE
或 R0HKE
存在
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));
}
希望对您有所帮助。