首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在非匹配组正则表达式之后排除匹配组

如何在非匹配组正则表达式之后排除匹配组
EN

Stack Overflow用户
提问于 2021-01-19 15:23:03
回答 1查看 508关注 0票数 1

我编写了一个regex,它使用regex组模式匹配一个字符串:

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

它基本上写着:

  • 第一组应长3个字符,只包含字母数字字符。
  • 第二组应长两个字符,只包含字母。
  • 最后一组可以是任意长度,并包含字母数字字符。

这意味着:

匹配1

全匹配0-8 abcfobar

集团serialCode 0-3 abc

serialMarket 3-5 fo

serialSuffix 5-8吧

上述情况是预期的结果。

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

匹配1

全匹配0-8 abc33bar

集团serialCode 0-3 abc

serialMarket 3-3

serialSuffix 3-8 33

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-19 16:46:49

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

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

RegEx演示

RegEx详细信息:

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

  • )?:结束非捕获组(可选)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65794415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档