将任何或一系列unicode符号与以下任何字符串匹配

时间:2019-08-13 03:01:50

标签: javascript regex

我想匹配一个数字,浮点数或符号(分数),然后是一个可选的空格,然后是:“ tsp”,“ teaspoon”或“ teaspoons”。

这是我所拥有的:

/(\d.*|½|⅓|⅔|¼|⅕|⅖|⅗|⅗) ?tsp|\1 ?teaspoons?/gm

这是我当前的结果:


1 tsp
// match: 1

2tsp
// match: 2

0.5tsp
// match: 0.5

½teaspoon
// match: undefined

0.5 teaspoons
// match: undefined

所需结果:

1 tsp
// match: 1

2tsp
// match: 2

0.5tsp
// match: 0.5

½teaspoon
// match: ½

0.5 teaspoons
// match: 0.5

1 个答案:

答案 0 :(得分:1)

您的正则表达式不起作用,因为您将\1的功能误认为是“递归组1”,而实际上是“匹配组1所匹配的”。这两个短语看似相似,但实际上有很大不同。

您想要的是“复制并粘贴组1,即用(\d.*|½|⅓|⅔|¼|⅕|⅖|⅗|⅗)替换\1,对吗?这样,您不必再次编写整个内容。但是,这就是“递归组1”(通常为\g<1>)的工作,JavaScript regex尚不支持。 \1的意思是“匹配任何匹配的组1”。在这种情况下,如果转到第二种选择,组1将不匹配任何内容!因此,\1不匹配任何内容。

您可以再次写出第1组:

/(\d.*|½|⅓|⅔|¼|⅕|⅖|⅗|⅗) ?tsp|(\d.*|½|⅓|⅔|¼|⅕|⅖|⅗|⅗) ?teaspoons?/gm

但这意味着您需要检查组1 组2。如果组1为空,请检查组2。幸运的是,此正则表达式可以重写为一个组:

/(\d.*|½|⅓|⅔|¼|⅕|⅖|⅗|⅗) ?(?:tsp|teaspoons?)/gm