RegEx不接受空格

时间:2016-07-19 03:24:24

标签: regex whitespace

嗨我有一个要求,不应该接受一堆包含空格的表达式。

以下是表达方式。

  1. PA#N<number>.<number>#ADP<number>例如PA#N1.1#ADP1
  2. PA#N<number>.<number>,<number>.<number>#ADP<number>例如PA#N1.1,1.2#ADP1,2
  3. PA#N<number>#ADP<number>例如PA#N1#ADP4
  4. PA#N<number>,<number>#ADP<number>例如PA#N1,2#ADP4
  5. PA#N<number>,<number>.<number>,<number>#ADP<number>例如PA#N1,2.1,3#ADP1
  6. PA#N<number>,<number>.<number>-<number>#ADP<number>例如PA#N1.1-3#ADP1
  7. PA#N<number>,<number>.<number>-<number>.<number>#ADP<number>例如PA#N1.1- 3.2#ADP1,2
  8. PA#NUAL,AZ,AN#FOP<number>
  9. PA#N1.1-2.1,3.1#ADP#PUSH
  10. PA*N1.1*ADP
  11. 如果在PA#<space>N<space>1<space>1#ADP处有任何空格也不可接受,但是PA#N1.1...#5#SOME TEXT(最后的SOME TEXT部分&#39;#&#39;免费提供免费文字空间是可以接受的)。

    PA*也不被接受。

    为了满足上述所有条件,我创建了一个正则表达式

    PA(?!\*$)(?!([#*].*\s+).*)(?!(\*N(\d+(\.\d+)?,?)+)$)(?!([#*](U.*|T.*|(N\d+\.?\d*)-(\d+\.?\d*)|(N(\d+(\.\d+)?,?)+))){1,3}[#*]ADP).*
    

    以上所有条件都与上述正则表达式相匹配,唯一缺少的是PA#N1.1#5#FREE TEXT(如果我们在FREE<SPACE>TEXT之间给出任何空格,则它不接受。

    如果我们不在FREE TEXT FREETEXT之间留出任何空格,那就与上面的正则表达式匹配。

    任何人都可以帮助找出我的错误以及正确的表达方式是什么?这两天我一直在努力。

1 个答案:

答案 0 :(得分:0)

我建议两件事来简化解决方案:

  1. 假设PA#N#ADP之间的所有组合都可以描述为由以太.,分隔的一系列1到6个数字,或-并可选择用空格包围。这可以用\s*\d+\s*(?:[\.,-]\s*\d+\s*){0,5}表示。我不确定这个假设对你来说是否可以接受,但如果是这样的话,这会简化正则表达式。如果假设不可接受,我在答案的最后提供了扩展正则表达式的链接。

  2. 编写一个模式以匹配您必须排除的所有字符串,然后使用here描述的方法将其反转。简而言之,它看起来像这样:/^((?!INVERTED_PATTERN).)*$/

  3. 本案例中的表达式为:

    ^((?!      # This and the final line allow invert the regex condition
    
    PA(?:
        \*(?:N\s*\d+\s*\.\s*\d+\s*\*ADP)?    # match the asterisk cases
      | \#\s*N\s*\d+\s*                      # or the hash cases
            (?:[\.,-]\s*\d+\s*){0,5}
        \#ADP\s*(?:\d|\#PUSH)
      | \#NUAL,AZ,AN\#FOP\d                  # or the 'UAL,AZ,AN' literal
    )
    
    ).)*$
    

    注意:此正则表达式需要使用x修饰符。

    演示:https://regex101.com/r/bY4xU6/3

    如果第一个假设不可接受,您可以从这里使用更详细的正则表达式:https://regex101.com/r/oD8uG7/1