特定匹配项的正则表达式格式



我正在尝试为以下格式编写正则表达式

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$

最新更新