Поэтому в основном то, что вы хотите, чтобы просканировать последовательность для символов «<», «>», «=» и «&», и если какой-либо из них нашли помните индекс и найденный символ, если '< 'или'> ', вы хотите узнать, стоит ли после этого «=», и если это так, следующий поиск должен начинаться после «=».
Отметьте, что вы не указали какие вы хотите с &=
или ==
.
Всякий раз, когда вам нужно сканировать строки для некоторого синтаксиса, всегда разумно, по крайней мере, рассматривать использование регулярных выражений.
Согласно спецификации выше вы хотите регулярное выражение, которое соответствует, если вы обнаружите какие-либо из следующих действий:
- '< ='
- '> ='
- '='
- '&'
- '<', за которым следует что-то еще, чем '='
- '>' След. B у что-то другое, чем '='
кодекс будет простым:
using System.Text.RegularExpressions;
string expression = ...;
var regex = new RegularExpression("&|<=|>=|[<>][^=]");
var matches = regex.Matches(expression);
matches
Объект представляет собой массив Match
объектов. Каждый match
объект имеет свои свойства Index
, Length
и Value
; именно те свойства, которые вы хотите.
foreach (var match in matches)
{
Console.WriteLine($"Match {match.Value} found"
+ " at index {match.Index} with length {match.Length}");
}
Вертикальная полоса |
в регулярном выражении означает OR; [ ]
означает любой из символов между скобками;; [^ ]
означает НЕ любой из символов между скобками.
Так найдено совпадение, если либо &
или <=
или >=
или любой символ в <>
, который не сопровождается =
.
Если вы хотите найти & = и ==, то ваше reguilar выражения будет еще проще:
- найти <> & = что следует =
- или найти какую-либо <> & =, не следуют =
Код:
var regex = new Regex("[<>&=]|[<>&=][^=]");
Хороший онлайн-тестер регулярных выражений, где вы можете проверить свое регулярное выражение can be found here. Это также показывает, какие совпадения найдены и описание синтаксиса регулярных выражений.
Где находится этот монструальный LINQ-оператор короче и, в частности, лучше читается, чем простой цикл foreach? – HimBromBeere
Я вроде согласен с этим. Я все еще хотел бы знать, можно ли выполнить linq для этого сценария. – Jimmy
Не делайте этого. Вам нужен лексер, поэтому напишите лексер. –