正则表达式(或其他建议)解析标签

don*_*hoe 3 javascript regex parsing

我正在尝试解析一个从标签中得到的字符串,到目前为止看起来像一个正则表达式可能是最干净的方法.该模式有一个解释如下:

#p3                  -> p = 3
#h4                  ->         h = [ 4 ]
#h4,h6               ->         h = [ 4, 6 ]
#p3,h4,h6            -> p = 3,  h = [ 4, 6 ]
#h4,h6,p3            -> p = 3,  h = [ 4, 6 ]
#h4s2,6,10           ->         h = [ 4 ],    s = { "4": [ 2, 6, 10 ] }
#h4s2,6,10,h6s5      ->         h = [ 4, 6 ], s = { "4": [ 2, 6, 10 ] , "6": [ 5 ] }
#p20h4s2,6,10,h6s5,1 -> p = 20, h = [ 4, 6 ], s = { "4": [ 2, 6, 10 ] , "6": [ 5, 1 ] }
Run Code Online (Sandbox Code Playgroud)

正如我所说,我认为正则表达式可能是我最好的选择,但它也是任何复杂事物的弱点.

如果您有其他建议/解决方案,那么我欢迎他们.我可以做到这一点使用if/else了大量的indexOfsplits等等...但我敢肯定,必须有比这更好的方式.

更新:左边的输出最好被认为是一种解释.虽然这是期望的最终结果,但正则表达式解决方案不必解决完整问题,但可能让我参与其中.另外,重申一下,我正在使用Javascript.

Wel*_*bog 5

您可以使用单个表达式来确定特定行是否有效,但如果您尝试基于输入字符串构建结构,那么您应该采用两步标记化/解析方案,因为这样做简化事情.

通过它的外观,你有三种类型的标记:p,hs.每个标记都是一个字母,后跟一个数字(后面跟着更多的数字s).

所以我开始使用一个tokenizer,用于将字符串转换为一系列抽象标记.可以使用正则表达式匹配每个标记.

我们来看看这个字符串:#p20h4s2,6,10,h6s5,1.虽然仍有输入,但您将根据剩余输入创建一系列令牌.

你的第一个标记是a 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块和上面的正则表达式找到令牌.

重要的是分离您正在使用字符串表示的部分(标记化)和您正在使用抽象表示的部分(解析).它使概念上的事情变得更加简单.如果您以后需要它们,也可以通过这种方式添加新类型的令牌.