Я пытаюсь разделить строку уравнений на токены. Ive нашел хорошую отправную точку »([A-Za-z] + | [0-9.] + | [& => < \ |!] + | \ S) '. Однако это имеет проблемы с отрицательными числами:tokenizing математическое уравнение с использованием regex
turns: '5--4=sin(2+3)'
into: ['5','-','-','4','=','sin','(','2','+','3',')']
want: ['5','-','-4','=','sin','(','2','+','3',')']
а также
turns: -3+3
into: ['-','3','+','3']
want: ['-3','+','3']
Похоже мое регулярное выражение может использовать то, что проверяет, есть ли номер для слева от «-» если не держите его со следующим номером (примечание «-3» ничего не имеет слева). Можно ли это сделать с помощью регулярного выражения? Или есть лучший инструмент, чтобы разделить это на .NET?
О да, регулярное выражение отлично подходит для лексинга - это проблема типа Хомски 3. OP не понимает, что результат, который он получил, на самом деле * точно *, что ему нужно. в '' '' '' '' '- фактически оператор унарного отрицания. –
@LucasTrzesniewski Конечно, регулярное выражение отлично подходит для лексинга, но OP хочет, чтобы его лексинг был контекстно-зависимым. Он хочет, чтобы два минуса в «-3-3» обрабатывались по-разному, что не является ни тем, что он хочет, ни тем, что может предложить регулярное выражение. – dasblinkenlight
Да, прочитав свой ответ уже второй раз, я понял, что вы имели в виду. Кстати, генератор лексеров не просто волшебным образом исправит «проблему», большинство просто используют regex под капотом;) –