繁体   English   中英

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

[英]Regex format for a particular Match

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

PA-123456-067_TY

它总是PA ,后跟一个破折号,6 位数字,另一个破折号,然后是 3 位数字,并以_TY

显然,当我编写此正则表达式以匹配上述格式时,它正确显示 output

^[^[PA]-]+-(([^-]+)-([^_]+))_([^.]+)

带有所有否定符号^

如果我以以下格式编写没有否定符号的正则表达式,这将不起作用

[[PA]-]+-(([-]+)-([_]+))_([.]+)

有人可以向我解释为什么会这样吗?

否定符号表示该字符不能是指定 class 内的任何内容。 你的正则表达式比它需要的复杂得多,因此混淆了你真正想要的东西。

你可能想要这样的东西:

^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$

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM