协助我建立自己的正则表达式

时间:2014-01-26 17:53:52

标签: c# regex

我在这个领域是全新的,我需要遵循这些规则的正则表达式:

  1. 只允许使用数字和符号。

  2. 必须以数字开头,并以数字结尾。

  3. 连续不得包含多个符号。 (例如,123+-4567不被接受,但12+345-67被接受。

  4. 我试过^[0-9]*[+-*/][0-9]*$,但我认为这是一次愚蠢的尝试。

2 个答案:

答案 0 :(得分:2)

你接近你的尝试。这个应该有用。

^[0-9]+([+*/-][0-9]+)*$

说明:

  • ^匹配字符串的开头
  • [0-9]+匹配1位或更多位数。
  • [+*/-]匹配指定符号中的一个
  • ([+*/-][0-9]+)*匹配符号组,后跟至少一位数字,重复0次或更多次
  • $匹配字符串结尾

答案 1 :(得分:1)

我们将从个别部分构建那个部分,然后我们将看到我们如何变得更聪明:

  1. 编号

    \d+
    

    将匹配整数。不是非常奇特,但我们需要从某个地方开始。

  2. 必须以数字开头并以数字结尾:

    ^\d+.*\d+$
    

    非常简单。我们对这两部分之间一无所知(尽管最后\d+只会匹配一个数字;我们最终可能想要解决这个问题。)

  3. 仅允许使用数字和符号。根据正则表达式其余部分的复杂性,通过明确拼写或使用否定前瞻来确保字符串中没有非(数字|符号)可能更容易。我会在这里选择后者,因为我们需要再次:

    (?!.*[^\d+*/-])
    

    如果在字符串中的任何位置存在任何非(数字|符号)字符,则将此粘贴到正则表达式的开头可确保正则表达式不匹配。另请注意,我将-放在字符类的末尾。这是因为它在字符类中的两个其他字符之间使用时具有某种特殊含义。

  4. 一行中不得包含多个符号。这是之前的变种。我们只是通过使用否定前瞻来确保永远不会有多个符号依次禁止两个符号:

    (?!.*[+/*-]{2})
    
  5. 全部放在一起:

    (?!.*[^\d+*/-])(?!.*[+/*-]{2})^\d+.*\d+$
    

    测试它:

    PS Home:\> '123+-4567' -match '(?!.*[^\d+*/-])(?!.*[+/*-]{2})^\d+.*\d+$'
    False
    PS Home:\> '123-4567' -match '(?!.*[^\d+*/-])(?!.*[+/*-]{2})^\d+.*\d+$'
    True
    

    但是,我只是从字面上解释了你的规则。如果你试图匹配算术表达式,这些算术表达式可以有多个操作数和运算符(但没有括号),那么你可以用不同的方式处理这个问题:

    1. 再次出现数字

      \d+
      
    2. [+/*-]
      
    3. 一个数字后跟一个运算符

      \d+[+/*-]
      
    4. 使用分组和重复来匹配一个数字,后跟任意数量的运算符和另一个数字的重复:

      \d+([+/*-]\d+)*
      
    5. 锚定它以便我们匹配整个字符串:

      ^\d+([+/*-]\d+)*$
      
    6. 通常,对于有效的问题,后一种方法效果更好,并且可以使表达更容易理解。前一种方法有其优点,但大多数情况下仅在实施密码策略时(除了»不能重复以前的任何30689密码«)。