Regex Can';无法获取要返回的正确索引

Regex Can';无法获取要返回的正确索引,regex,streamreader,Regex,Streamreader,好的,首先我要感谢大家在过去几周里对我的帮助,这里还有一个 我有一个文件,我正在使用正则表达式查找术语“TamedName”出现了多少次。这是最简单的部分:) 最初,我是这样设置的 StreamReader ff = new StreamReader(fileName); String D = ff.ReadToEnd(); Regex rx = new Regex("TamedName"); foreach (Match

好的,首先我要感谢大家在过去几周里对我的帮助,这里还有一个

我有一个文件,我正在使用正则表达式查找术语“TamedName”出现了多少次。这是最简单的部分:)

最初,我是这样设置的

            StreamReader ff = new StreamReader(fileName);
        String D = ff.ReadToEnd();
        Regex rx = new Regex("TamedName");
        foreach (Match Dino in rx.Matches(D))
        {
            if (richTextBox2.Text == "")
                richTextBox2.Text += string.Format("{0} - {1:X} - {2}", Dino.Value, Dino.Index, ReadString(fileName, (uint)Dino.Index));
            else
                richTextBox2.Text += string.Format("\n{0} - {1:X} - {2}", Dino.Value, Dino.Index, ReadString(fileName, (uint)Dino.Index));
        }
它返回了完全错误的索引点,如图所示

我很有信心我知道它为什么会这样做,可能是因为从二进制文件到字符串的转换,显然不是所有的字符都会被转换,所以这会忽略实际的索引计数,所以尝试将其关联起来根本不起作用。。。问题是,我不知道如何将正则表达式与二进制文件一起使用并使其正确转换:(

我使用Regex而不是简单的搜索函数,因为每次出现“TamedName”之间的差异太大,无法编码到函数中


真的希望你们能帮我解决这个问题:(我没什么主意了!!

问题是你在读一个二进制文件,streamreader在把它读入Unicode字符串时会做一些解释。它需要作为字节处理

下面是我的代码。(仅供参考,您需要启用不安全编译来编译代码-这是为了允许快速搜索二进制数组)

为了正确的归属,我借用了IndexOf的字节版本

名称空间索引
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串fileName=“TheIsland.ark”;
string searchString=“TamedName”;
byte[]bytes=LoadBytesFromFile(文件名);
byte[]searchBytes=System.Text.ascienceoding.Default.GetBytes(searchString);
列出所有指针=FindAllBytes(字节,搜索字节);
}
静态字节[]LoadBytesFromFile(字符串文件名)
{
FileStream fs=newfilestream(文件名,FileMode.Open);
//BinaryReader br=新的BinaryReader(fs);
//StreamReader ff=新的StreamReader(文件名);
MemoryStream ms=新的MemoryStream();
财政司司长(ms);
fs.Close();
返回ToArray女士();
}
公共静态列表FindAllBytes(字节[]干草堆,字节[]针)
{
长电流偏移=0;
长偏移步长=针的长度;
长指数=0;
List allneedleoffset=新列表();
而((索引=IndexOf(干草堆、针、当前偏移量))!=-1L)
{
添加(索引);
currentOffset=索引+偏移步长;
}
返回所有偏移量;
}
公共静态不安全长索引(字节[]干草堆,字节[]针,长起始时间设置=0)
{
固定(字节*h=草堆)固定(字节*n=针)
{
对于(字节*hNext=h+startOffset,hEnd=h+haystack.LongLength+1-needle.LongLength,nEnd=n+needle.LongLength;hNext
非常感谢,我已经为此奋斗了这么久,谢谢你,伙计,我可以问一下你的速度是多少吗+1@frisbee对于我所拥有的测试文件,它只需要一秒钟左右的时间,但我并没有真正对它进行基准测试。
namespace ArkIndex
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "TheIsland.ark";
            string searchString = "TamedName";
            byte[] bytes = LoadBytesFromFile(fileName);
            byte[] searchBytes = System.Text.ASCIIEncoding.Default.GetBytes(searchString);

            List<long> allNeedles = FindAllBytes(bytes, searchBytes);    
        }

        static byte[] LoadBytesFromFile(string fileName)
        {
            FileStream fs = new FileStream(fileName, FileMode.Open);
            //BinaryReader br = new BinaryReader(fs);
            //StreamReader ff = new StreamReader(fileName);

            MemoryStream ms = new MemoryStream();
            fs.CopyTo(ms);
            fs.Close();
            return ms.ToArray();   
        }

        public static List<long> FindAllBytes(byte[] haystack, byte[] needle)
        {
            long currentOffset = 0;
            long offsetStep = needle.Length;
            long index = 0;
            List<long> allNeedleOffsets = new List<long>();
            while((index = IndexOf(haystack,needle,currentOffset)) != -1L)
            {
                allNeedleOffsets.Add(index);
                currentOffset = index + offsetStep;
            }
            return allNeedleOffsets;
        }

        public static unsafe long IndexOf(byte[] haystack, byte[] needle, long startOffset = 0)
        {
            fixed (byte* h = haystack) fixed (byte* n = needle)
            {
                for (byte* hNext = h + startOffset, hEnd = h + haystack.LongLength + 1 - needle.LongLength, nEnd = n + needle.LongLength; hNext < hEnd; hNext++)
                    for (byte* hInc = hNext, nInc = n; *nInc == *hInc; hInc++)
                        if (++nInc == nEnd)
                            return hNext - h;
                return -1;
            }
        }    
    }
}