我发布了一个先前的答案,其中我误读了您的部分问题。所以这是重做。
老实说,这是最好的正则表达式语句:
(\d+(?:[.,]\d+)?)\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?)(?:\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?))?
为什么?因为使用此语句,您有一个 Group 1、Group 2 和 Group 3,您可以从中提取三个值(显然,第三个有时可能是空白的)。如果你使用量词来重复一个子表达式,你将不得不进入组集合,你的代码会变得混乱。
我的长的和你的长的有什么区别?好吧,上面的 long 可以更好地处理“小数”,而您的则允许不正确的数字,例如“382.”。
但是,如果您想要走的路线更短,那么正则表达式将是:
(\d+(?:[.,]\d+)?)(?:\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?)){1,2}
在这种情况下,您的代码可以从组 1 中提取第一个值,但随后必须使用组集合来查看组 2 是否具有堆栈或只有一个值。如果是堆栈,获取值 2 的捕获集合项 0,然后捕获值 3 的集合项 1。
这些正则表达式与 Stema 的非常相似,除了它们组织捕获组。
故障:
( //Capture Group 1 - Begin
\d+ //Require Digits
(?: //Non Capture Sub Expression
[.,]\d+ //Allow a "Decimal", but if it exists, Require Digits after it
)? //Optional Quantifier for the "decimal" sub-expression
) //Capture Group 1 - End
(?: //Non Capture Sub Expression
\s* //Optionally capture space(s)
[xX*/\\] //Require a Separator
\s* //Optional capture space(s)
( //Capture Group 2 - Begin
\d+ //Require Digits
(?: //Non Capture Sub Expression
[.,]\d+ //Allow a "Decimal", but if it exists, Require Digits after it
)? //Optional Quantifier for the "decimal" sub-expression
) //Capture Group 2 - End
){1,2} //Require at least one Separator/Digit pattern, but allow two
同样,我的“简短”答案和 Stema 之间的区别只是我更恰当地处理“小数”。但是您可能不需要额外的安全性,在这种情况下,stema 就可以了。此外,当您只是使用子表达式进行分组或重复时,使用非捕获表达式,并且不想捕获它。从长远来看,向这些堆栈添加值确实会影响您的处理速度。
因此,如果您不关心捕获组、处理完美或正确的小数处理……而您想要的只是尽可能短的正则表达式,Stema 就一针见血。