在c#中,验证以下条件的最佳正则表达式是什么?
1,2-10,5-10,6,9-100 -它类似于指定为范围的页码或用逗号分隔的单个页码。
发布于 2013-12-09 20:40:20
尝试以下表达式:
\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*
请注意,该模式非常脆弱,因为它不允许任何空白。
这个想法是围绕着主要的子模式\d+(?:-\d+)?
构建的。
\d+
-匹配一个或多个连续数字(要么是独立的,要么是左范围边界)-\d+
-匹配一个减号,后面跟着一个或多个数字(右范围边界)尾随问号使减号和右范围边界可选(这也是匹配单个页码所必需的);(?:)
表示一个非捕获群。
发布于 2013-12-09 20:58:21
当我剪切并粘贴您的示例字符串时,我注意到在开始时1,
后面有一个空格:
1, 2-10,5-10,6,9-100
^
我不知道这是不是故意的,但我认为允许一个或多个空格字符环绕逗号是合理的。
尽管如此,这里有一个regex,可以满足您的需求:
^[0-9]+(?:(?:\s*,\s*|-)[0-9]+)*$
^^^^^^ ^^^^^^^ ^ ^^^^^^ ^
A B1 B2 C D
^^^^^^^^^
B
A - One or more digits
B1 - A comma with optional space characters on either side, *OR*
B2 - A dash (without whitespace on either side)
C - One or more digits
D - Optionally repeat B and C
注: \d
和[0-9]
不是等价的;前者与所有Unicode数字匹配。我已经假定只有通过0
通过9
的数字是您感兴趣的。
发布于 2013-12-09 20:52:30
此正则表达式将分别匹配每个页面范围:
\d+-\d+|\d+
我用交替来完成这件事。如果\d+-\d+
(一个页码范围)不匹配,它将简单地匹配一个单数无限数\d+
。
如果在除-
之外的页面范围内遇到任何字符,则需要更改regex。
https://stackoverflow.com/questions/20480155
复制相似问题