Search code examples
c#.netvisual-studioc#-4.0registry

Search text file for text above which pattern matches input


I am trying to make my program display the text above the input text which matches a pattern I set.

For example, if user input 'FastModeIdleImmediateCount"=dword:00000000', I should get the closest HKEY above, which is [HKEY_CURRENT_CONFIG\System\CurrentControlSet\Enum\SCSI\Disk&Ven_ATA&Prod_TOSHIBA_MQ01ABD0\4&6a0976b&0&000000] for this case.

[HKEY_CURRENT_CONFIG\System\CurrentControlSet\Enum\SCSI\Disk&Ven_ATA&Prod_TOSHIBA_MQ01ABD0\4&6a0976b&0&000000]
"StandardModeIdleImmediateCount"=dword:00000000
"FastModeIdleImmediateCount"=dword:00000000

[HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES]

[HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES\TSDDD]

[HKEY_CURRENT_CONFIG\System\CurrentControlSet\SERVICES\TSDDD\DEVICE0]
"Attach.ToDesktop"=dword:00000001

Could anyone please show me how I can code something like that? I tried playing around with regular expressions to match text with bracket, but I am not sure how to make it to only search for the text above my input.


Solution

  • I'm assuming your file is a .txt file, although it's most probably not. But the logic is the same. It is not hard at all, a simple for() loop would do the trick. Code with the needed description:

    string[] lines = File.ReadAllLines(@"d:\test.txt");//replace your directory. We're getting all lines from a text file.
    
            string inputToSearchFor = "\"FastModeIdleImmediateCount\"=dword:00000000";  //that's the string to search for
    
            int indexOfMatchingLine = Array.FindIndex(lines, line => line == inputToSearchFor); //getting the index of the line, which equals the matchcode
    
            string nearestHotKey = String.Empty;
            for(int i = indexOfMatchingLine; i >=0; i--)    //looping for lines above the matched one to find the hotkey
            {               
                if(lines[i].IndexOf("[HKEY_") == 0)         //if we find a line which begins with "[HKEY_" (that means it's a hotkey, right?)
                {
                    nearestHotKey = lines[i];               //we get the line into our hotkey string
                    break;                                  //breaking the loop
                }
            }
    
            if(nearestHotKey != String.Empty)               //we have actually found a hotkey, so our string is not empty
            {
                //add code...
            }