RegEx 不接受空格

RegEx is not accepting spaces

您好,我有一个要求,其中不应接受一堆表达式,其中也包括白色 spaces。

下面是表达式。

  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

如果它在 PA#<space>N<space>1<space>1#ADP 处有任何 spaces 也不可接受,但是 PA#N1.1...#5#SOME TEXT (最后一个 '#' 之后的 SOME TEXT 部分带有自由文本免费 spaces 是可以接受的)。

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之间给出任何space则不接受。

如果我们不在 FREE TEXT 之间给出任何 space 就像 FREETEXT 那么它与上面的正则表达式匹配。

谁能帮我找出错误,正确的表达方式是什么?这2天我一直在挣扎。

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

  1. 假设 PA#N#ADP 之间的所有组合都可以描述为由以太 .,- 并且可以选择用空格包围。这可以用\s*\d+\s*(?:[\.,-]\s*\d+\s*){0,5}来表示。我不确定这个假设是否适合您,但如果可以,这将大大简化正则表达式。如果该假设不可接受,我在答案末尾向扩展正则表达式提供了一个 link。

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

这种情况下的表达式为:

^((?!      # 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