有一个相当复杂的格式化字符串,就像没有解析它的可读正则表达式一样。目的是获得一个特定的子串,例如,并获得它的原始位置。在解析一个位之后达到该子串,例如修剪,移除开始的东西并搜索第n个元素。我只是想通过这个例子向你展示复杂性,否则它非常普遍。
有关演示,请参阅此基本示例。它的方式并不重要,只是为了达到一个非常复杂的解析模型。显然,可以有更多的规则,你也可以编写一个更简单的模型。
我试图让它尽可能随意。解析模型如下:
string text = "{ FirstBlock {Index1,Index2} SecondBlock}";
text = text.Trim();
if (text.First() == '{')
{
text = text.SubString(1, text.Length - 2);
}
text = text.Trim();
string firstBlock = text.Split(new char[] { ' ', '{' })[0];
text = text.Remove(0, firstBlock.Length).Trim();
string indices = "";
if (text.First() == '{')
{
indices = text.Split(new char[] { '{', '}' })[0];
text = text.Remove(0, indices.Length).Trim();
}
string[] blocks = text.Split(' ');
有一种方法非常容易实现且简单明了。但有时候并没有给你正确的结果。这样你就可以解析字符串并获得子字符串,然后进行重新搜索,例如string.IndexOf()
并获取位置。但是,如果有两个匹配,例如,即使你不确定你想要那个,你也会得到第一个。
我认为非常优雅,但仍然不完美的方式是在开头索引字符串的字符,然后解析它,最终你最终得到正确的字符和它们的位置。我的问题是,你不能真正使用库提供的功能,我不知道如何做到这一点。使用上面的代码段:
List<Tuple<int, char>> indexedText = text
.Select((ch, index) => new Tuple<int, char>(index, ch))
.ToList();
使用此结构,您仍然可以在没有库方法的情况下处理字符串,但最终会获得位置索引。例如,修剪:
indexedText = indexedText
.SkipWhile(indexedChar => char.IsWhiteSpace(indexedChar.Item2))
.ToList();
问题可以是新解决方案,也可以是使用带索引字符串的库方法的方法。目的是在解析字符串后返回索引。有可能是一种非常简单的方法,但我还没有找到合适的解决方案。我不想要的解决方案是简化解析系统,正如我所说的只是为了演示。