查找字符串中的每个索引&单独存储索引

时间:2016-03-26 17:57:07

标签: c# string indexing

我有一个基本上包含XML文件的字符串,带有标签和所有内容。 我特别感兴趣的一个标签是<address source>。 问题是,XML文件并不总是相同的。有时可能只有一个标记<address source>存在,有时可能有5个存在,有时甚至20个或更多。

所以,想象一下我的字符串是这样的:

string XMLToAnalyze = "<XML><TAG1>somecontent</TAG1><address source>content</address source><address source>content</address source><TAG2>morecontent</TAG2></XML>"`

因此,在此特定字符串中,标记<address source>的两倍。

我需要的是:

我需要找到每个标记<address source>的索引(或IndexOf),我需要单独存储这些索引,最好是单独存储(每个索引一个整数),或者在数组中。这是因为我需要访问每个单独的整数以填充Winforms表单中的某些字段。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您需要的是IDictionary&lt; [string],IList&lt; [int]&gt;&gt;。 在搜索开始标记时,可以按以下方式将它们存储在字典中: 如果标记存在,则将新找到的索引添加到添加的列表中,否则将新元素添加到字典中,其中包含新的列表,其中包含单个项目 - 索引的第一个出现。在您查看完所有字符串后 - 您的字典将包含您要查找的地图。

public static class XmlTagMapBuilder
{
    public static IDictionary<string, IList<int>> GetOpenTagIndexMap(string inputXml)
    {
        // Argument validation goes here

        IDictionary<string, IList<int>> result = new Dictionary<string, IList<int>>();

        int currentIndex = -1;
        string lastOpenTag = null;
        while (true)
        {
            string nextOpenTagName;
            int nextOpenTagIndex;
            if (TryGetNextOpenTagIndex(inputXml, currentIndex, out nextOpenTagName, out nextOpenTagIndex))
            {
                lastOpenTag = nextOpenTagName;
                currentIndex = nextOpenTagIndex;

                IList<int> tagIndicies;
                if (!result.TryGetValue(nextOpenTagName.ToUpperInvariant(), out tagIndicies))
                {
                    tagIndicies = new List<int>();
                    result.Add(nextOpenTagName, tagIndicies);
                }

                tagIndicies.Add(nextOpenTagIndex);
            }
            else
            {
                break;
            }
        }

        return result;
    }

    /// <summary>
    /// Tries to get next open tag in the given <see cref="inputXml"/> string after the specified startIndex.
    /// </summary>
    /// <param name="inputXml">The string which contains the xml tags.</param>
    /// <param name="startIndex">The index after which to look for the open tag.</param>
    /// <param name="nextOpenTagName">If a tag was found, contains its name.</param>
    /// <param name="nextOpenTagIndex">If a tag was found, contains the start index of it.</param>
    /// <returns>true - if the tag was found. false - otherwise.</returns>
    private static bool TryGetNextOpenTagIndex(string inputXml, int startIndex, out string nextOpenTagName, out int nextOpenTagIndex)
    {
        // Need to add implementaiton here
    }
}

答案 1 :(得分:1)

使用Regex匹配所有字符串,然后遍历匹配并找到每个匹配的索引。

这种逻辑必须奏效。这是Tested

        List<int> indexes = new List<int>();
        string XMLToAnalyze = "<XML><TAG1>somecontent</TAG1><address source>content</address source><address source>content</address source><TAG2>morecontent</TAG2></XML>";
        var regex = new Regex(@"<address source>");

        foreach (Match match in regex.Matches(XMLToAnalyze))
        {
            indexes.Add(match.Index);
        }

indexes将包含匹配字符串的所有索引。

OutPut: 29,69