Мое решение такое:
private static void Main(string[] args)
{
var input = @"<par1=""value1"" par2=""value2"" par7=""value7"">";
var parameter = "par2";
var val = GetValue(input, parameter);
Console.WriteLine($"{parameter} = {val}");
Console.ReadKey();
}
/// <summary>
/// Get value of param from specific string
/// </summary>
/// <param name="input">Specific string</param>
/// <param name="sample">param name</param>
/// <returns>Value represented by string. if not found - string.Empty</returns>
private static string GetValue(string input, string sample)
{
var isInQuotes = false; // Для определения того, находится ли текущий символ внутри кавычек
for (int i = 0; i <= input.Length - sample.Length - 3; i++)
{
if (input[i] == '"')
isInQuotes = !isInQuotes;
if (IsSame(input, i, sample) && !isInQuotes)
{
var j = i + sample.Length;
// Идем до открывающейся кавычки
while (input[j] != '"')
{
j++;
if (j == input.Length)
return string.Empty;
}
j++;
var sb = new StringBuilder();
// Идем до закрытия кавычек, при этом записывая значение в stringBuilder
while (input[j] != '"')
{
sb.Append(input[j++]);
if (j == input.Length)
return string.Empty;
}
return sb.ToString();
}
}
return string.Empty;
}
/// <summary>
/// Check equality of sample and src substring
/// </summary>
/// <param name="src"></param>
/// <param name="from">Start index of src</param>
/// <param name="sample"></param>
/// <returns></returns>
private static bool IsSame(string src, int from, string sample)
{
if (from + sample.Length > src.Length)
return false;
for (int i = 0; i < sample.Length; i++)
{
if (src[from + i] != sample[i])
return false;
}
return true;
}
Тестирование и ревью этого куска кода приветствуется. Я не вставлял сюда проверку входной строки на открытие/закрытие тега <>.
В остальном все проверки есть (если я ничего не упустил).
par='value'par="a='b'par=value– nick_n_a May 30 '19 at 09:27<как байт, найти нужные символы черезArray.IndexOf<byte>иArray.ConstrainedCopyи брать GetString - нужные куски, не преобразовуя в строку даже названий ключей (конвертировать только значения), это ускорит разбор. Но кода будет много. Да... Substring - не самая оптимальная ф-ция... имеется ввиду что она оптимальнее Regex. – nick_n_a May 30 '19 at 09:41valueможет содержать внутри себя кавычки? – Andrei Khotko May 30 '19 at 10:28<Name="..." ...>? Или всё же это xml и в начале есть имя элемента:<elem attr="..." ...>? – Alexander Petrov May 30 '19 at 10:28