【问题标题】:Updating my regex to include dots and hyphens更新我的正则表达式以包含点和连字符
【发布时间】:2020-07-03 20:49:21
【问题描述】:

我的正则表达式代码[A-Z]{1,}\d{3,}\w? 可以正常返回字符串,例如 CX3623、M3326、Y2362,但我也希望能够返回以下格式的字符串:

YH321-2
V2021/V2022
1.2A-2351
YGH256-4268

我应该在正则表达式中添加什么?

演示:https://regex101.com/r/MjPkFh/2

【问题讨论】:

  • 如果我弄错了,请纠正我,但第三个例子永远不会匹配?我的意思是,它以非字符开头。其余的,也许是[A-Z]{1,}\d{3,}[\d-/]*\w??否则,您能否提供一个文本列表以及您希望匹配和不匹配的内容?我使用regexr.com 来探索正则表达式。
  • 查看您的原始问题,[A-Z]+\d{3,} 就足够了。 \w? 部分似乎是多余的。考虑到你的新任务......这些字符串看起来都完全不同。构建字符串的规则是什么?
  • 这取决于接受的字符和格式,但也许^[A-Z]*\d+(?:\.\d+)?[A-Z]*(?:[\/-][A-Z]*\d+)?$ regex101.com/r/GP6jQA/1
  • regex101.com/r/MjPkFh/2 好像没有2222-0221,YH321-2也不见了-2

标签: javascript regex string match regular-language


【解决方案1】:

对于第一部分,您可以使用alternation 匹配不同的格式。

您可以使用可选的非捕获组 (?:...)? 将第二部分设为可选,并匹配 /-(可选地后跟字符 A-Z 和 1+ 位)。

\b(?:[A-Z]+ )?(?:[A-Z]*\d{3,}|\d+(?:\.\d+)?[A-Z]+)(?:[\/-][A-Z]*\d+)?\b

说明

  • \b字边界
  • (?:[A-Z]+ )? 可选匹配 1+ 个字符 A-Z,后跟一个空格
  • (?:非捕获组
    • [A-Z]*\d{3,} 匹配 0+ 次 A-Z 和 3 个或更多数字
    • |或者
    • \d+(?:\.\d+)?[A-Z]+ 匹配 1+ 位可选的小数部分和 1+ 次 A-Z
  • )关闭群
  • (?:非捕获组
    • [\/-][A-Z]*\d+ 匹配 /-,0+ 次 A-Z 和 1+ 位
  • )? 关闭群组并设为可选
  • \b字边界

Regex demo

【讨论】:

  • 我有一个类似于“这与在 COB 4000-9876 中解决的问题相同”的字符串。是否可以仅匹配整个句子中的标识符 COB 4000-9876?目前您发布的正则表达式与我的字符串中的任何内容都不匹配
  • @shAkur 这要归功于锚点^$。我已将其更新为使用单词边界\b 你的意思是这样吗? \b(?:[A-Z]+ )?(?:[A-Z]+\d+|\d+(?:\.\d+)?[A-Z]*)(?:[\/-][A-Z]*\d+)?\bregex101.com/r/gwt8F3/1
  • 不是真的...包括我不想要的其他字符。从那里看到regex101.com/r/ipuBTH/1 我只想得到TT3641
  • @shAkur 可能是这样的\b(?:[A-Z]+ )?(?:[A-Z]*\d{3,}|\d+(?:\.\d+)?[A-Z]+)(?:[\/-][A-Z]*\d+)?\bregex101.com/r/oMWalz/1
  • @shAkur 您可以在第一个备选方案regex101.com/r/b0Lh3v/1 之后添加匹配的 0+ 字符 A-Z 如果您想排除后缀,您可以匹配它们并捕获捕获组中的后续内容。 regex101.com/r/19nDsR/1
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 2011-04-11
相关资源
最近更新 更多