一组中具有不同重复次数的字符

时间:2013-12-23 12:03:03

标签: c# regex

我遇到像这样的正则表达式的问题:

^[0-9\s{0,1}]{4,}$

我希望匹配数字可以设置为不同的重复时间然后是空格字符 以某种方式,[]括号之间的整个表达式可以重复至少四次,但是可以在表达式中的任何位置的空白空间可以重复零次或一次。 我检查了整个正则表达式语言 - C#的快速参考,没有找到。 请帮忙,

提前感谢!

3 个答案:

答案 0 :(得分:4)

我这样做:

^(?=\d*\s?\d*$)(\d\s?){4,}$

<强>解释

The regular expression:

(?-imsx:^(?=\d*\s?\d*$)(\d\s?){4,}$)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
    \s?                      whitespace (\n, \r, \t, \f, and " ")
                             (optional (matching the most amount
                             possible))
----------------------------------------------------------------------
    \d*                      digits (0-9) (0 or more times (matching
                             the most amount possible))
----------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  (                        group and capture to \1 (at least 4 times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    \d                       digits (0-9)
----------------------------------------------------------------------
    \s?                      whitespace (\n, \r, \t, \f, and " ")
                             (optional (matching the most amount
                             possible))
----------------------------------------------------------------------
  ){4,}                    end of \1 (NOTE: because you are using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \1)
----------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 1 :(得分:2)

您的模式无效:

^[0-9\s{0,1}]{4,}$

这是使用方括号的定义

示例:

[\w'-] - 匹配任何单词字符,单引号或连字符,仅表示其中一个

并添加{4,}后,重复四次或更多次,所以基本上你重复匹配一个数字或空白四次或更多次,这可能不是你看的对

如果您需要帮助制作模式,请向我提供样本输入和预期结果,我会尽力帮助您。

现在我想出了以下模式。

<强>模式

^(\d{4,})$|^(\s\d{3,})$|^(\d{3,}\s)$|^(\d{2,}\s\d+?)$|^(\d+?\s\d{2,})$

它捕获任意数量的数字,后跟一个空格/前面有空格或任意数字的数字,用一个空格分隔。

答案 2 :(得分:2)

字符类中的量化器没有意义。因为它将字面上匹配以下字符{},01

诀窍是使用前瞻性的一些替代:

^                                      # Begin of string
(?:                                    # Non-capturing group
   [0-9]{4,}                           # Case when there is no white-space
   |                                   # Or
   (?=[0-9]*\s[0-9]*$)[0-9\s]{5,}      # Case when there is one white-space
)                                      # End of non-capturing group
$                                      # End of string

第一个表达式很容易理解,让我们解释第二个表达式:

  • (?=[0-9]*\s[0-9]*$):确保只有数字且只有一个空格
  • [0-9\s]{5,}:将数字和空格匹配5次或更多次。我选择了5次,因为OP希望匹配至少4位和可选的一个空格。所以在这种情况下,如果有空格,我们至少会有5个字符。如果没有空格,正则表达式的第一部分就会处理它。