在索引字符串中搜索

时间:2015-08-16 20:27:09

标签: string parsing

情节

有一个相当复杂的格式化字符串,就像没有解析它的可读正则表达式一样。目的是获得一个特定的子串,例如,并获得它的原始位置。在解析一个位之后达到该子串,例如修剪,移除开始的东西并搜索第n个元素。我只是想通过这个例子向你展示复杂性,否则它非常普遍。

有关演示,请参阅此基本示例。它的方式并不重要,只是为了达到一个非常复杂的解析模型。显然,可以有更多的规则,你也可以编写一个更简单的模型。

  • FirstBlock {Index1,Index2} SecondBlock ThirdBlock
  • {FirstBlock {Index1,Index2} SecondBlock}
  • {FirstBlock SecondBlock ThirdBlock FourthBlock}

我试图让它尽可能随意。解析模型如下:

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();

实际问题

问题可以是新解决方案,也可以是使用带索引字符串的库方法的方法。目的是在解析字符串后返回索引。有可能是一种非常简单的方法,但我还没有找到合适的解决方案。我不想要的解决方案是简化解析系统,正如我所说的只是为了演示。

0 个答案:

没有答案