使用javascript正则表达式解析单位

假设我有一个字符串,其中包含我想要分成单个单元的一些单元(可能有也可能没有前缀).例如,字符串可以包含“Btu(th)”或“Btu(th).ft”或甚至“mBtu(th).ft”,其中mBtu(th)是标准化单位毫升热化学BTU(这纯粹是一个例子) .

我目前有以下(简化)正则表达式,但它失败的情况“mBtu(th).ft”:

/(m|k)??(Btu\(th\)|ft|m)(?:\b|\s|$)/g

目前,这并未正确检测’Btu(th)’的结尾与’ft’的开头之间的边界.我理解javascript正则表达式不支持回顾所以如何准确地解析字符串?

补充说明

>上面提到的正则表达式在前缀和单位组周围大大简化.前缀可能跨越多个字符,如’Ki’,因此字符集不适合.
>希望每个组捕获前缀匹配作为组1,单位作为匹配2,即’mBtu(th).ft’匹配一个将是[‘m’,’Btu(th)’]并匹配两个会是[”,’ft’].
>前缀匹配需要是惰性的,以便字符串’m’将匹配为单位米而不是前缀milli.同样,’mm’的匹配需要是前缀milli和单位米.

最佳答案
我会尝试:

/((m)|(k)|(Btu(\(th\))?)|(ft)|(m)|(?:\.))+/g

至少在上面的示例中,它匹配合并为一个字符串的所有单元.
DEMO

编辑

另一次尝试(DEMO):

/(?:(m)|(k)|(Btu)|(th)|(ft)|[\.\(\)])/g

这一个再次只匹配一个部分,但如果你使用$1,$2,$3,$4等,(DEMO)你可以提取其他片段.它忽略了.,(,),字符.问题是计算适当匹配的组,但它在某种程度上起作用.

或者如果您接受多个单独的匹配,我认为简单的替代方案是

/(m|k|Btu|th|ft)/g 

转载注明原文:使用javascript正则表达式解析单位 - 代码日志