如何在不匹配的组之后排除匹配的组 - 正则表达式

How to exclude matched group after a non-matched group - regex

我写了一个正则表达式,它使用正则表达式组模式匹配字符串:

^(?<serialCode>[a-zA-Z0-9]{0,3})(?<serialMarket>[a-zA-Z]{0,2})(?<serialSuffix>[a-zA-Z0-9]*)$

基本上它说:

这转化为:

匹配 1

完整比赛 0-8 abcfobar

serialCode 0-3 abc

serialMarket 3-5 fo

serialSuffix5-8巴

以上情况是预期结果

当正则表达式对于像 abc33bar 这样的字符串应该失败时,它会失败,因为第 4 个和第 5 个字符是数字而不是字母,这是正确的。问题是应该匹配第二组的字符移动到下一个匹配组(serialSuffix),结果是:

匹配 1

完全匹配 0-8 abc33bar

serialCode 0-3 abc

serialMarket3-3

serialSuffix3-8 33bar

如何防止在非匹配组(包括非匹配组)之后创建非匹配组和匹配组?

您可以在最后一个可选捕获组中尝试使用此正则表达式进行回顾:

^(?<serialCode>[a-zA-Z0-9]{3})(?:(?<serialMarket>[a-zA-Z]{1,2})(?<serialSuffix>(?<=^.{5})[a-zA-Z0-9]*)?)?

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (?<serialCode>[a-zA-Z0-9]{3}): 匹配并捕获 serialCode 捕获组
  • 中的 3 个字母数字
  • (?:: 启动非捕获组
    • (?<serialMarket>[a-zA-Z]{1,2}):匹配并捕获serialMarket捕获组
    • 中的1个或2个字母
    • (?<serialSuffix>(?<=^.{5})[a-zA-Z0-9]*)?:在optionalserialSuffix捕获组中匹配并捕获0个或多个字母数字。该组将仅在前 5 个字符后使用后向断言捕获 (?<=^.{5})
  • )?:结束非捕获组(可选)