![](/img/trans.png)
[英]How can i match particular format in input using java.util.regex in java?
[英]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.