我正在尝试为以下格式编写正则表达式
PA-123456-067_TY
它总是PA
,后跟一个破折号、6 位数字、另一个破折号、然后是 3 位数字,并以_TY
结尾
显然,当我编写此正则表达式以匹配上述格式时,它会正确显示输出
^[^[PA]-]+-(([^-]+)-([^_]+))_([^.]+)
与所有否定符号^
如果我以以下格式编写没有否定符号的正则表达式,这将不起作用
[[PA]-]+-(([-]+)-([_]+))_([.]+)
有人可以向我解释为什么会这样吗?
否定符号表示字符不能是指定类中的任何内容。您的正则表达式比它需要的要复杂得多,因此混淆了您真正想要的东西。
你可能想要这样的东西:
^PA-(d+)-(d+)_TY$
。它匹配以PA-
开头的任何内容,然后包括两组由破折号分隔的数字,然后是下划线和字母TY
。如果您希望PA
之后的所有内容都是您捕获的内容,但分为三组,那么它更抽象一些:
^PA-(.+)-(.+)_(.+)$
这匹配:
PA-
- 任何字符的捕获组
- 破折号
- 任何字符的另一个捕获组
- 下划线
- 所有剩余字符直到行尾
[...]
所说的字符类匹配列表中的任何单个字符,因此您的第一个捕获组(([^-]+)-([^_]+))
查找任何不是破折号的字符,后跟破折号(这很好(,然后是任何不是下划线的内容(再次很好(。在周围使用额外的括号集会创建另一个捕获组(可能是组 1,因为它是正则表达式引擎到达的第一个括号(......这部分是可以的,但在这种情况下可能会使解释答案变得不那么直观。
但是,在重写中,您的第一个捕获组(([-]+)-([_]+))
匹配[-]+
,这意味着"一个或多个破折号"后跟一个破折号,后跟任意数量的下划线,后跟一个下划线。由于您的输入没有紧跟PA-
的破折号,因此整个正则表达式无法找到任何内容。
将PA
放在嵌入式字符类中也会使事情变得复杂。你的第一部分的第一部分是寻找,好吧,我实际上不确定在实践中如何解释[^[PA]-]+
,但我怀疑它类似于"不是 P 或 A 或破折号任意次数"。第二个是寻找相反的东西,我认为。但是你不想要这些,你只想开始,除了你关心的角色的实际序列之外,没有任何其他东西,这只是PA-
。
更新:根据对原始问题的评论中的澄清,知道您想要固定大小的数字组,它看起来像这样:
^PA-(d{6})-(d{3})_TY$
这捕获PA-
,然后是 6 位数字,然后是破折号,然后是 3 位数字,然后是_TY
。六位数字和 3 位数字将分别位于捕获组 1 和 2 中。
如果这些数字的大小可能会更改,则{x}
替换为+
以仅捕获数字,而不考虑最大长度。
根据您的评论,这将是合适的PA-d{6}-d{3}_TY
编辑:如果要匹配一行,请将其与锚点一起使用:^PA-d{6}-d{3}_TY$