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

时间:2015-07-09 23:34:18

标签: javascript regex

假设我有一个字符串,其中包含我想要分成单个单元的一些单元(可能有也可能没有前缀)。例如,字符串可以包含" Btu(th)"或者" Btu(th).ft"甚至" mBtu(th).ft"其中mBtu(th)是bastardised unit milli thermochemical BTU&s(这纯粹是一个例子)。

我目前有以下(简化)正则表达式,但是它没有用于案例" 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和单位米。

3 个答案:

答案 0 :(得分:2)

我会尝试:

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

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

修改

另一次尝试(DEMO):

.

这个只能再匹配一个部分,但是如果你使用$ 1,$ 2,$ 3,$ 4等,(DEMO)你可以提取其他片段。它会忽略()/(m|k|Btu|th|ft)/g ,字符。问题是计算适当匹配的组,但它在某种程度上起作用。

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

class A:
    def B(time):
        seconds = time
        return seconds
seconds = A.B(int)

答案 1 :(得分:0)

单词边界不会分隔两个非单词字符。因此,您实际上并不想要单词边界,因为括号和句点不是有效的单词字符。相反,您希望字符串后面没有单词字符,因此您可以改为使用它:

[mk]??(Btu\(th\)|ft|m)(?!\w)

Demo

答案 2 :(得分:0)

我相信你是在追求这样的事情。如果我理解正确的想要匹配任何类型的元素,可能先于mk字符,并用parantheses或点分隔。

/[\s\.\(]*(m|k?)(\w+)[\s\.\)]*/g

https://regex101.com/r/eQ5nR4/2

如果您不关心能够匹配括号但只返回您可以做的元素

/(m|k?)(\w+)/g

https://regex101.com/r/oC1eP5/1