嗨我有一个要求,不应该接受一堆包含空格的表达式。
以下是表达方式。
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
处有任何空格也不可接受,但是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
之间留出任何空格,那就与上面的正则表达式匹配。
任何人都可以帮助找出我的错误以及正确的表达方式是什么?这两天我一直在努力。
答案 0 :(得分:0)
我建议两件事来简化解决方案:
假设PA#N
和#ADP
之间的所有组合都可以描述为由以太.
或,
分隔的一系列1到6个数字,或-
并可选择用空格包围。这可以用\s*\d+\s*(?:[\.,-]\s*\d+\s*){0,5}
表示。我不确定这个假设对你来说是否可以接受,但如果是这样的话,这会简化正则表达式。如果假设不可接受,我在答案的最后提供了扩展正则表达式的链接。
编写一个模式以匹配您必须排除的所有字符串,然后使用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