Я хотел бы преобразовать строку, отформатированную как математический инфикс, в массив токенов, используя регулярные выражения.Я очень плохо знаком с регулярными выражениями, поэтому простите меня, если ответ на этот вопрос окажется слишком тривиальным
Например:
"31+2--3*43.8/1%(1*2)"
-> ["31", "+", "2", "-", "-3", "*", "43.8", "/", "1", "%", "(", "*", "2", ")"]
Я уже реализовал метод, который выполняет эту задачу, однако он состоит из множества строк кода и нескольких вложенных циклов .Я подумал, что когда я определю больше операторов / функций, которые могут даже состоять из нескольких символов, таких как log
или cos
, будет проще редактировать строку регулярного выражения, чем добавлять еще много строк кода в мою рабочую функцию.Подходят ли регулярные выражения для этого, и если да, то где я иду не так?Или мне лучше добавить в мой рабочий парсер?
Я уже ссылался на следующие сообщения SO:
Как разбить строку, но также сохранить разделители?
Это было очень полезно, но я не думаю, что я правильно использую 'lookahead'.
Проверка математических выражений с использованием регулярных выражений?
Решение вышеуказанного вопроса не преобразует строку в массив токенов.Скорее, он проверяет, является ли данная строка допустимым математическим выражением.
Мой код выглядит следующим образом:
func convertToInfixTokens(expression: String) -> [String]?
{
do
{
let pattern = "^(((?=[+-/*]))(-)?\\d+(\\.\\d+)?)*"
let regex = try NSRegularExpression(pattern: pattern)
let results = regex.matches(in: expression, range: NSRange(expression.startIndex..., in: expression))
return results.map
{
String(expression[Range($0.range, in: expression)!])
}
}
catch
{
return nil
}
}
Когда я передаю действительное выражение инфикса этой функции, оновозвращает nil
.Где я ошибаюсь с моей строкой регулярных выражений?
ПРИМЕЧАНИЕ: Я даже не пытался разобрать скобки как отдельные токены.Я все еще выясняю, почему это выражение не сработает:
"-99+44+2+-3/3.2-6"
Любая обратная связь приветствуется, спасибо!