Разбор реестра .REG файла в C# - PullRequest
1 голос
/ 27 февраля 2020

Мне нужно проанализировать Windows .REG файлов, чтобы получить следующую информацию:

  • имя ключа
  • тип значения
  • данные значения

Я попробовал этот пример проекта здесь , который делает именно то, что я хочу, но не может правильно обработать некоторые крайние случаи. Например, он не обрабатывает экранированные кавычки. В reg-файле экранированные кавычки выглядят так \ "

Тестовый reg-файл, который я использую для проверки:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\SampleTest\Key1]
@="This is the default value. 我爱喝咖啡"
"FilePath"="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""
"我爱喝咖啡"="ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
"BinaryData1"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,11,11,11,11,11,\
  11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,\
  11,11,11,11,11,11,11,11,11,11,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,\
  22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,33,33,33,33,33,33,33,33,\
  33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,\
  44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,\
  44,44,44,44,44,44,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,\
  55,55,55,55,55,55,55,55,55,55,55,55,55,66,66,66,66,66,66,66,66,66,66,66,66,\
  66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,77,77,77,77,77,\
  77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,\
  77,77,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,\
  88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,99,99,99,99,99,99,99,99,\
  99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,aa,\
  aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
  aa,aa,aa,aa,aa,aa,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,\
  bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
  cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,dd,dd,dd,dd,dd,\
  dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,\
  dd,dd,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,\
  ee,ee,ee,ee,ee,ee,ee,ee,ee,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\
  ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff
"DwordMin"=dword:00000000
"SingleByte"=hex:ab
"DwordMax"=dword:ffffffff
"DwordSpecial"=dword:abcdef12
"QwordMin"=hex(b):00,00,00,00,00,00,00,00
"QwordMax"=hex(b):ff,ff,ff,ff,ff,ff,ff,ff
"QwordSpecial"=hex(b):12,f0,ce,cd,ab,ef,cd,ab
"MultiStringList"=hex(7):4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,\
  69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,31,00,00,\
  00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,00,\
  20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,32,00,00,00,4d,00,75,00,6c,\
  00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,00,\
  6c,00,75,00,65,00,20,00,23,00,33,00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,\
  00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,\
  20,00,23,00,34,00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,\
  00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,35,00,\
  00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,\
  00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,36,00,00,00,4d,00,75,00,\
  6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,\
  00,6c,00,75,00,65,00,20,00,23,00,37,00,00,00,4d,00,75,00,6c,00,74,00,69,00,\
  20,00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,\
  00,20,00,23,00,38,00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,\
  72,00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,39,\
  00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,\
  67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,31,00,30,00,00,00,00,\
  00
"ExpandableString"=hex(2):25,00,57,00,49,00,4e,00,44,00,49,00,52,00,25,00,5c,\
  00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,\
  73,00,25,00,5c,00,25,00,54,00,45,00,4d,00,50,00,25,00,00,00
"SpecialChar"="~`!@#$%^&*()_+[]\\{}|;',./[]\\"

[HKEY_CURRENT_USER\SOFTWARE\SampleTest\Key1\Key2]
@="Key2 Default VAlue"

[HKEY_CURRENT_USER\SOFTWARE\SampleTest\Key1\Key2\Key3]
@="Key 3 Default VAlue"

[HKEY_CURRENT_USER\SOFTWARE\SampleTest\Key1\New Key #1]
"~!@#$%^&*()_+{}|[]\\;',./<>?;'\""="strange reg key name"

[HKEY_CURRENT_USER\SOFTWARE\SampleTest\Key1\New Key #2]

[HKEY_CURRENT_USER\SOFTWARE\SampleTest\KEY~`!@#$%^&*()-+=[]{}|;'":<>?,./]
"Strange2"="More strange data"

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest]

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest\Key1]
@="This is the default value. 我爱喝咖啡"
"我爱喝咖啡"="I love cofeeeeeeeeeeeeeeeeeeeeeeeeeeeABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
"BinaryData1"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,11,11,11,11,11,\
  11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,\
  11,11,11,11,11,11,11,11,11,11,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,\
  22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,33,33,33,33,33,33,33,33,\
  33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,44,\
  44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,\
  44,44,44,44,44,44,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,\
  55,55,55,55,55,55,55,55,55,55,55,55,55,66,66,66,66,66,66,66,66,66,66,66,66,\
  66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,77,77,77,77,77,\
  77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,\
  77,77,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,\
  88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,99,99,99,99,99,99,99,99,\
  99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,aa,\
  aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,aa,\
  aa,aa,aa,aa,aa,aa,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,\
  bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,bb,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,\
  cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,cc,dd,dd,dd,dd,dd,\
  dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd,\
  dd,dd,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,ee,\
  ee,ee,ee,ee,ee,ee,ee,ee,ee,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,\
  ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff
"DwordMin"=dword:00000000
"SingleByte"=hex:ab
"DwordMax"=dword:ffffffff
"DwordSpecial"=dword:abcdef12
"QwordMin"=hex(b):00,00,00,00,00,00,00,00
"QwordMax"=hex(b):ff,ff,ff,ff,ff,ff,ff,ff
"QwordSpecial"=hex(b):12,f0,ce,cd,ab,ef,cd,ab
"MultiStringList"=hex(7):4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,\
  69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,31,00,00,\
  00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,00,\
  20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,32,00,00,00,4d,00,75,00,6c,\
  00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,00,\
  6c,00,75,00,65,00,20,00,23,00,33,00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,\
  00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,\
  20,00,23,00,34,00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,\
  00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,35,00,\
  00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,\
  00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,36,00,00,00,4d,00,75,00,\
  6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,\
  00,6c,00,75,00,65,00,20,00,23,00,37,00,00,00,4d,00,75,00,6c,00,74,00,69,00,\
  20,00,53,00,74,00,72,00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,\
  00,20,00,23,00,38,00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,\
  72,00,69,00,6e,00,67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,39,\
  00,00,00,4d,00,75,00,6c,00,74,00,69,00,20,00,53,00,74,00,72,00,69,00,6e,00,\
  67,00,20,00,56,00,61,00,6c,00,75,00,65,00,20,00,23,00,31,00,30,00,00,00,00,\
  00
"ExpandableString"=hex(2):25,00,57,00,49,00,4e,00,44,00,49,00,52,00,25,00,5c,\
  00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,\
  73,00,25,00,5c,00,25,00,54,00,45,00,4d,00,50,00,25,00,00,00
"FilePath"="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""
"SpecialChar"="~`!@#$%^&*()_+[]\\{}|;',./[]\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest\Key1\Key2]
@="Key2 Default VAlue"

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest\Key1\Key2\Key3]
@="Key 3 Default VAlue"

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest\Key1\New Key #1]
"~!@#$%^&*()_+{}|[]\\;',./<>?;'\""="strange reg key name"

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest\Key1\New Key #2]

[HKEY_LOCAL_MACHINE\SOFTWARE\SampleTest\KEY~`!@#$%^&*()-+=[]{}|;'":<>?,./]
"Strange2"="More strange data"

Я пытаюсь исправить то, как он обрабатывает строку:

"FilePath"="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""

Соответствующий код использует регулярное выражение:

/// <summary>
    /// Creates a flat Dictionary using given search pattern
    /// </summary>
    /// <param name="content">The content string to be parsed</param>
    /// <returns>A Dictionary with retrieved keys and remaining content</returns>
    private Dictionary<String, String> NormalizeValuesDictionary(String content)
{
    string searchPattern = @"^[\t ]*("".+""|@)=(""[^""]*""|[^""]+)";

    MatchCollection matches = Regex.Matches(content, searchPattern, RegexOptions.Multiline);

    Dictionary<String, String> dictKeys = new Dictionary<string, string>();

    foreach (Match match in matches)
    {
        try
        {
            //Retrieve key
            String sKey = match.Groups[1].Value;

            //Retrieve value
            String sValue = match.Groups[2].Value;

            //Removing the ending CR
            while (sKey.EndsWith("\r\n"))
            {
                sKey = sKey.Substring(0, sKey.Length - 2);
            }

            if (sKey == "@")
                sKey = "";
            else
                sKey = StripeLeadingChars(sKey, "\"");

            while (sValue.EndsWith("\r\n"))
            {
                sValue = sValue.Substring(0, sValue.Length - 2);
            }

            if (dictKeys.ContainsKey(sKey))
            {
                string tmpcontent = dictKeys[sKey];
                StringBuilder tmpsb = new StringBuilder(tmpcontent);
                if (!tmpcontent.EndsWith(Environment.NewLine)) tmpsb.AppendLine();
                tmpsb.Append(sValue);
                dictKeys[sKey] = tmpsb.ToString();
            }
            else
            {
                dictKeys.Add(sKey, sValue);
            }
        }
        catch (Exception ex)
        {
            throw new Exception(String.Format("Exception thrown on processing string {0}", match.Value), ex);
        }
    }
    return dictKeys;
}

Я исправил регулярное выражение для обработки экранированных кавычек (\ ") следующим образом:

string searchPattern = "^[\\t ]*(\"[^\"\\\\]*(?:\\\\.+[^\"\\\\]*)*\"|@)=(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"+)";

, но теперь это не так не разбирать не строковые ключи, т.е. BinaryData1. Я пытаюсь понять, какое регулярное выражение может обрабатывать все типы данных, но также включать в строки экранированные кавычки.

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете обновить шаблон так, чтобы повторение совпадений не совпадало с \ или " ИЛИ с совпадением \, за которым следует любой символ.

^[\t ]*(".+"|@)=("(?:[^"\\]|\\.)*"|[^"]+)
                   ^^^^^^^^^^^^^^

Regex demo

string searchPattern = @"^[\t ]*("".+""|@)=(""(?:[^""\\]|\\.)*""|[^""]+)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...