我正在尝试匹配代表维度的模式:
2,2x3
3*5
4 X 44,5
5x5x5
数字可以是double(使用点或逗号)或int。分隔符可以是xX * / \(并且可以混合到,例如:5 * 3x9)。维度中最多有3个数字,第3个不是必需的(我通常只匹配2个维度)。数字和分隔符之间可以有任意数量的空格。我正在使用这个正常工作的正则表达式,但我想知道是否有更简单的方法来实现它:
(\d+[.,]?\d*)\s*[xX*/\\]\s*(\d+[.,]?\d*)(\s*[xX*/\\]\s*(\d+[.,]?\d*))?
答案 0 :(得分:3)
您可以使用量词{1,2}
,表示匹配一次或两次。最后一个可选组与正则表达式中间的过去相同。所以只需删除重复的部分并在该组上使用该量词。
(\d+[.,]?\d*)(\s*[xX*/\\]\s*(\d+[.,]?\d*)){1,2}
见here on Regexr。我添加了锚点^
和$
,取决于您在.net中使用的方法,如果您需要它们。
答案 1 :(得分:2)
我发布了之前的回答,我误解了你的部分问题。所以这是重做。
老实说,这是最好的正则表达式声明:
(\d+(?:[.,]\d+)?)\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?)(?:\s*[xX*/\\]\s*(\d+(?:[.,]\d+)?))?
为什么呢?因为使用此声明,您可以从中获取第1组,第2组和第3组,您可以从中获取三个值(第三个可能有时是空白)。如果使用量词来重复子表达式,则必须进入组合集,并且代码会变得混乱。
我长的和长的之间有什么区别?好吧,上面的长一个对“小数”有更好的处理,而你的允许不正确的数字,如“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's之间的区别仅在于我的处理“Decimals”更合适。但是你可能不需要额外的安全性,在这种情况下,stema是好的。此外,当您仅使用子表达式进行分组或重复时,请使用非捕获表达式,并且不想捕获它。从长远来看,为这些堆栈添加值会对处理速度产生一定影响。
因此,如果您不关心捕获组,处理完美或正确的十进制处理......并且您想要的只是最短的正则表达式,Stema在头上钉了钉。