我正在编写一个正则表达式来匹配文本框的内容,该文本框应包含数字和数字范围以及分隔这些元素的逗号,例如:
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表达式。
答案 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)))