【问题标题】:Convert Autoit Regex to C#将 Autoit 正则表达式转换为 C#
【发布时间】:2011-09-28 17:20:20
【问题描述】:

我无法解决这个问题,我得到了这个搜索表达式

.*?(8986(.{8})8A4F03)

它在 autoit 中运行得非常快,并给了我 1 个结果,但如果我在 c# 中尝试它,它似乎会挂起。我也试过了

(8986(.{8})8A4F03)

它在 autoit 和 c# 中都非常有效,但给了我 2 个结果,但我只想要第一个结果。我已经阅读了 autoit 和 c# 的“备忘单”,但我就是不明白。

部分autoit代码

Global $SearchExression = _
    ".*?(8B0D(.{8})898D40F1FFFF6A01)" & _ ;Base_Address
    ".*?(8986(.{8})8A4F03)" & _ ;LVL_Offset
    ".*?(898E(.{8})8B5714)" & _ ;Culti_Offset
    ".*?(8996(.{8})8B4718)" & _ ;EXP_Offset
    ".*?(8986(.{8})8B4F04)" & _ ;Spirit_offset
    ".*?(898E(.{8})8B570C)" & _ ;HP_OffSet
    ".*?(8996(.{8})8B471C)" & _ ;MP_OffSet
    ".*?(8986(.{8})8B4F08)" & _ ;CHI_OffSet
    ".*?(898E(.{8})8B5710)" & _ ;MaxHP_OffSet
    ".*?(8996(.{8})8B4720)" & _ ;MaxMP_OffSet
    ".*?(8986(.{8})8A4702)" & _ ;MaxCHI_Offset
    ".*?(8B108996(.{8})8B4004)" & _ ;gold_Offset
    ".*?(6A0A8986(.{8}))" & _ ;state_Offset
    ".*?(8986(.{8})8B40048BC8)" & _ ;castid_Offset
    ".*?(A1(.{8})578B482081C1EC)" & _ ;BaseCall_Offset
    ".*?(568BF18B86(.{8})85C0)" & _ ;target_Offset
    ".*?(8B8E(.{8})3BCB740655)" & _ ;pet_Offset
    ".*?(8B8E(.{8})8B47503BC8)" & _ ;str_Offset
    ".*?(8B96(.{8})8B47543BD0)" & _ ;dex_Offset
    ".*?(8B86(.{8})8B4F5C3BC1)" & _ ;vit_Offset
    ".*?(8B8E(.{8})8B47603BC8)" & _ ;mag_Offset
    ".*?(8B96(.{8})8B47643BD0)" & _ ;reputation_Offset
    ".*?(EB5D8B8E(.{8})B801)" & _ ;class_Offset
    ".*?(8B491C33C08B91(.{8})85D2)" & _ ;jump_Offset
    ".*?(32C0C38B89(.{8})568BB0)" & _ ;charid_Offset
    ".*?(8B83(.{8})8D4C243C)" & _ ;name_Offset
    "";".*?((.{8}))" & _ ;
 Global $NameArray[26] = [ _
    "Base_Address", _
    "LVL_Offset", _
    "Culti_Offset", _
    "EXP_Offset", _
    "Spirit_Offset", _
    "HP_Offset", _
    "MP_Offset", _
    "CHI_Offset", _
    "MaxHP_Offset", _
    "MaxMP_OffSet", _
    "MaxCHI_Offset", _
    "Gold_Offset", _
    "State_Offset", _
    "CastID_Offset", _
    "BaseCall_Address", _
    "TargetID_Offset", _
    "Pet_Offset", _
    "STR_Offset", _
    "DEX_Offset", _
    "VIT_Offset", _
    "MAG_Offset", _
    "Reputation_Offset", _
    "Class_Offset", _
    "Jump_Offset", _
    "CharID_Offset", _
    "Name_Offset"]
If FileExists($File) Then
    $FileHnd = FileOpen($File, 16)
    Local $Data = FileRead($FileHnd, FileGetSize($File))
    FileClose($FileHnd)
Else
    Local $Data = ""
EndIf
If $Data <> "" Then
    Local $x = 0
    Local $check = StringRegExp($Data, $SearchExression, 3)
    If IsArray($check) Then
        Global $info[UBound($check) / 2][3]
        For $i = 1 To (UBound($check) - 1) Step 2
            MsgBox(0,"",$check[$i])
            $info[$x][0] = $NameArray[$x]
            $info[$x][1] = _RemoveZero(Reverse($check[$i]))
            $info[$x][2] = Dec(Reverse($check[$i]))
            $x += 1
        Next

到目前为止的c#代码

if (File.Exists(file) == true)
        {
            FileStream inputFile = new FileStream(file, FileMode.Open , FileAccess.Read,FileShare.ReadWrite);
            byte[] byteBuffer = new byte[inputFile.Length];
            inputFile.Read(byteBuffer, 0, (int) inputFile.Length);
            inputFile.Dispose();
            StringBuilder client = new StringBuilder();
            for (int i = 0; i < byteBuffer.Length; i++)
            {
                client.Append(byteBuffer[i].ToString("X2"));
            }
            // Clipboard.SetText(client.ToString()); //get string to paste into regexbuddy

            Regex rx = new Regex(@".*?(8986(.{8})8A4F03)"); //works perfect in autoit but hangs here
            //Regex rx = new Regex(@"(8986(.{8})8A4F03)"); // too many groups + too many matches
            //Regex rx = new Regex(@"8986(.{8})8A4F03"); //one group but too many matches

            foreach (Match mx in rx.Matches(client.ToString()))
            {
                Console.WriteLine(mx);
                //Console.WriteLine(mx.Groups[1]);
            }
        }

我没有做出原始表达,我不声称知道它们是如何工作的

字符串的第一部分是

4D5A90000300000004000000FFFF0000B8000000000000004000000

我想要的结果是

6C040000

【问题讨论】:

  • 你想用这个正则表达式匹配什么?
  • 我看不出为什么这在 c# 中不起作用。请向我们展示一个源字符串,您期望的结果和重要的:c# 代码。
  • 我正在寻找内存地址,源字符串有 700 万个字符,所以我不想在这里粘贴。 RegexBuddy 给出相同的结果/挂起,所以它不是问题的代码,我有 26 个这样的表达式。 .*?如果我删除.*,总是会导致挂起?一些表达式开始返回 2 个结果而不是 1
  • 我不希望你复制/超过 700 万个字符,但只有一小部分可以使用。 “2个结果而不是1个”是什么意思?它匹配两次还是您的意思是您正在创建的两个捕获组...。如果没有我要求的三件事,我认为不可能帮助您。
  • 这就是它似乎挂起的原因:regular-expressions.info/catastrophic.html 你了解模式匹配的内容,以及为什么它匹配它的结果吗?如果您试图缩小范围以仅匹配一个,我们需要查看所需的匹配项和不需要的匹配项。

标签: c# regex pcre autoit


【解决方案1】:

试试这个 C# sn-p:

string resultString = null;
resultString = Regex.Match(text, "(?<=8986).{8}(?=8A4F03)").Value;

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多