避免重复使用正则表达式的定义

时间:2014-02-06 17:04:00

标签: c# .net regex

我正在编写一个正则表达式来匹配文本框的内容,该文本框应包含数字和数字范围以及分隔这些元素的逗号,例如:

123, 123-422, 2323, 22-333

它的正则表达式是:

^(((\s*[0-9]+\s*)|((\s*[0-9]+\s*)-(\s*[0-9]+\s*)))(,((\s*[0-9]+\s*)|((\s*[0-9]+\s*)-(\s*[0-9]+\s*))))*)$

这不是很漂亮,实际上非常重复,但我用C#代码定义它:

var num = @"(\s*[0-9]+\s*)";
var range = string.Format("({0}-{0})", num);
var numOrRange = string.Format("({0}|{1})", num, range);
var regex = string.Format("^({0}(,{0})*)$", numOrRange);

正则表达式语法中是否有任何功能可以让您定义" groups" (并为其指定名称),然后重复使用那些"组"?上面的正则表达式代码是相当可维护的,但我不希望使用string.format来定义reg表达式。

3 个答案:

答案 0 :(得分:1)

在这种情况下,我不认为问题是重复 我认为问题在于无法以有意义的方式看待它 对于我的生活,我无法绕过那些程序员 当他们应该像代码一样格式化表达时,坚持压缩表达式。

大多数引擎都将扩展修饰符作为内联构造或外部选项。正则表达式应始终在源代码中进行格式化。

你的正则表达式使用非常快速的展开方法,它应该保持这种方式 即使Dot-Net提供了递归调用,但他们没有,也不是这样 跟你的正则表达式一起去。坚持你所拥有的。

在削减了一些内容之后,看到它的作用或性能不应该是一个问题。

 // @"^\s*[0-9]+(?:\s*-\s*[0-9]+)?(?:\s*,\s*[0-9]+(?:\s*-\s*[0-9]+)?)*"     
 Regex rx = new Regex(
   @"
      ^ 
      \s*     
      [0-9]+ 
      (?: \s* - \s* [0-9]+ )?
      (?:
           \s* , \s* 
           [0-9]+ 
           (?: \s* - \s* [0-9]+ )?
      )*
   ", RegexOptions.IgnorePatternWhitespace);

答案 1 :(得分:0)

也许是这样的:

var regex = @"^(?:[0-9]+(?:-[0-9]+)?(?:, |$))+$";

答案 2 :(得分:0)

据我了解你的需要,这将完成这项工作:

^(((\s*[0-9]+\s*)|((?3)-(?3)))(,(?2))*)$

符号(?NUM)表示NUM部分被重复使用,即。 \s*[0-9]+\s*

(?3)\s*[0-9]+\s*
(?2)(((\s*[0-9]+\s*)|((?3)-(?3)))