Возможно, вы можете использовать одно выражение, чтобы определить, является ли конкретная строка действительной или нет, но если вы пытаетесь построить структуру, основанную на входных строках, то вам, вероятно, следует использовать двухэтапную схему токенизации / парсинга так как это упростит вещи.
Судя по всему, у вас есть три типа токенов: p
, h
и s
. Каждый токен представляет собой букву, за которой следует число (за которым следуют дополнительные цифры в случае s
).
Итак, я бы начал с токенизатора, предназначенного для преобразования строки в последовательность абстрактных токенов. Каждый токен можно сопоставить с помощью регулярного выражения.
Давайте возьмем эту строку: #p20h4s2,6,10,h6s5,1
. Пока еще есть ввод, вы будете создавать последовательность токенов на основе оставшегося ввода.
Ваш первый токен p
со значением 20
. Тогда у вас есть h
со значением 4
. Затем s
со значением [2,6,10]
и так далее. Чтобы определить, какой токен есть какой, используйте очень простое регулярное выражение. p
выражение может быть p\d+
. h
может быть h\d+
. s
похоже, что это будет s(\d+)(,\d+)*
.
Результатом вашего шага токенизации является последовательность таких объектов: { p(20), h(4), s(2,6,10), h(6), s(5,1) }
. На этом этапе вы можете решить, что s(2,6,10)
является частью h(4)
, и построить свою структуру, не беспокоясь о строковом представлении структуры.
Теперь, что касается фактической реализации этого в JavaScript, это не будет слишком сложно. Последовательность токенов может быть массивом, и вы можете найти токены, используя блоки if / else и приведенные выше регулярные выражения.
Важным является разделение части, в которой вы используете строковое представление (токенизация), и части, в которой вы используете абстрактное представление (синтаксический анализ). Концептуально все становится намного проще. Также проще добавлять новые типы токенов, если они понадобятся вам позже.