嗨,我有一个要求,其中的一堆表达式不应该被接受,其中包括空格以及。
以下是表达方式。
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#ADP1PA#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#PUSHPA*N1.1*ADP如果它在PA#<space>N<space>1<space>1#ADP上有任何空格也是不可接受的,但是PA#N1.1...#5#SOME TEXT (在最后的'#‘后面有自由文本的SOME TEXT部分是可以接受的)。
PA*也不可接受。
为了满足上述所有条件,我创建了一个regex。
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 )之间没有任何空间,那么这与上面的正则表达式相匹配。
有人能帮我找出我的错误吗?正确的表述是什么?这两天我一直在挣扎。
发布于 2016-07-19 08:54:37
为了简化解决方案,我建议两件事:
PA#N和#ADP之间的所有组合都可以描述为一系列1到6个数字,这些数字由醚.或,或-分隔,并可选择地被空格包围。这可以由\s*\d+\s*(?:[\.,-]\s*\d+\s*){0,5}表示。我不确定这个假设是否为您所接受,但如果是的话,这将大大简化正则表达式。如果这个假设是不可接受的,我在答案的末尾提供了一个扩展正则表达式的链接。/^((?!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
https://stackoverflow.com/questions/38449083
复制相似问题