页面范围的正则表达式

时间:2013-12-09 20:32:28

标签: c# regex

c#中用于验证以下条件的最佳正则表达式是什么?

1,2-10,5-10,6,9-100 - 它类似于指定为范围的页码或用逗号分隔的个别页面。

3 个答案:

答案 0 :(得分:5)

尝试以下表达式:

\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*

请注意,该模式非常脆弱,因为它不允许任何空格。


这个想法围绕主子模式\d+(?:-\d+)?构建:

  1. \d+ - 匹配一个或多个连续数字(独立或左边界)
  2. -\d+ - 匹配一个减号后跟一个或多个数字(右范围边界)
  3. 尾随问号使得减号和右范围边界可选(这也需要匹配单页数); (?:)表示non-capturing group

答案 1 :(得分:1)

当我剪切并粘贴您的样本字符串时,我注意到一开始就跟1,之后的空格:

1, 2-10,5-10,6,9-100
  ^

我不知道这是否是故意的,但我认为允许一个或多个空格字符包围逗号是合理的。

那就是说,这是一个符合您要求的正则表达式

^[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] 不等于;前者匹配all Unicode digits。我假设您只对数字09感兴趣。

答案 2 :(得分:0)

此正则表达式将单独匹配每个页面范围:

\d+-\d+|\d+

我用替换来完成这个。如果\d+-\d+(页码范围)不匹配,则只会匹配单数,无限数\d+

如果在-之外的页面范围之间遇到任何字符,则需要更改正则表达式。