如何简化以下正则表达式

时间:2013-06-04 11:59:51

标签: c# regex simplify

我正在尝试匹配代表维度的模式:

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*))?

2 个答案:

答案 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在头上钉了钉。