RegEx 不接受空格
RegEx is not accepting spaces
您好,我有一个要求,其中不应接受一堆表达式,其中也包括白色 spaces。
下面是表达式。
PA#N<number>.<number>#ADP<number>
例如PA#N1.1#ADP1
PA#N<number>.<number>,<number>.<number>#ADP<number>
例如PA#N1.1,1.2#ADP1,2
PA#N<number>#ADP<number>
例如PA#N1#ADP4
PA#N<number>,<number>#ADP<number>
例如PA#N1,2#ADP4
PA#N<number>,<number>.<number>,<number>#ADP<number>
例如 PA#N1,2.1,3#ADP1
PA#N<number>,<number>.<number>-<number>#ADP<number>
例如PA#N1.1-3#ADP1
PA#N<number>,<number>.<number>-<number>.<number>#ADP<number>
例如PA#N1.1- 3.2#ADP1,2
PA#NUAL,AZ,AN#FOP<number>
PA#N1.1-2.1,3.1#ADP#PUSH
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天我一直在挣扎。
我建议两件事来简化解决方案:
假设 PA#N
和 #ADP
之间的所有组合都可以描述为由以太 .
或 ,
或 -
并且可以选择用空格包围。这可以用\s*\d+\s*(?:[\.,-]\s*\d+\s*){0,5}
来表示。我不确定这个假设是否适合您,但如果可以,这将大大简化正则表达式。如果该假设不可接受,我在答案末尾向扩展正则表达式提供了一个 link。
编写一个模式来匹配您必须 排除 的所有字符串,然后使用 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
您好,我有一个要求,其中不应接受一堆表达式,其中也包括白色 spaces。
下面是表达式。
PA#N<number>.<number>#ADP<number>
例如PA#N1.1#ADP1
PA#N<number>.<number>,<number>.<number>#ADP<number>
例如PA#N1.1,1.2#ADP1,2
PA#N<number>#ADP<number>
例如PA#N1#ADP4
PA#N<number>,<number>#ADP<number>
例如PA#N1,2#ADP4
PA#N<number>,<number>.<number>,<number>#ADP<number>
例如PA#N1,2.1,3#ADP1
PA#N<number>,<number>.<number>-<number>#ADP<number>
例如PA#N1.1-3#ADP1
PA#N<number>,<number>.<number>-<number>.<number>#ADP<number>
例如PA#N1.1- 3.2#ADP1,2
PA#NUAL,AZ,AN#FOP<number>
PA#N1.1-2.1,3.1#ADP#PUSH
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天我一直在挣扎。
我建议两件事来简化解决方案:
假设
PA#N
和#ADP
之间的所有组合都可以描述为由以太.
或,
或-
并且可以选择用空格包围。这可以用\s*\d+\s*(?:[\.,-]\s*\d+\s*){0,5}
来表示。我不确定这个假设是否适合您,但如果可以,这将大大简化正则表达式。如果该假设不可接受,我在答案末尾向扩展正则表达式提供了一个 link。编写一个模式来匹配您必须 排除 的所有字符串,然后使用 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