我想匹配一个数字,浮点数或符号(分数),然后是一个可选的空格,然后是:“ 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
答案 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