我有一个包含子字符串的多个实例以及其他文本的字符串。子字符串通过以给定的字母序列(例如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 * //结尾的内容。有没有办法在正则表达式比赛中表达这一点?
答案 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();
}