regex - 如何在 REGEX 表达式中间包含一个子字符串(除了精确的子字符串)?

标签 regex

问题

我正在尝试匹配 3 个组,其中一组是有条件的

字符串:12345-12345-1230

第 1 组:12345-12345

第 2 组:-123

第 3 组:0

但是,如果字符串不是“-000”,我只想匹配第 2 组。这意味着如果该部分为“-000”,则组 2 将为空白,或者为这 4 个字符的其他值; '-123' '-001' 等)。

这是正则表达式,它只接受任何内容作为第 2 组: ^(.{5}-.{5})(.{4})([0-9])$ regex101

我尝试过的

负向前瞻:

  • ^(.{5}-.{5})(?!-000)([0-9])$
  • ^(.{5}-.{5})(.{4}(?!.{4}))([0-9])$

或运算符:

  • ^(.{5}-.{5})(-000)|(.{4})([0-9])$
  • 这是我最接近的结果,但是我无法让它与最终条件 ([0-9])$ 一起工作。将删除案例 (-000) 作为一个单独的组作为接受案例(而不是 -000)也是不理想的。

最佳答案

您可以尝试:

^(\d{5}-\d{5})(?:-000|(-\d{3}))(\d)$

查看在线demo .


  • ^ - 行 anchor 开始。
  • ( - 打开第一个捕获组。
    • \d{5}-\d{5} - 匹配 5 个数字、一个连字符,然后再匹配 5 个数字。
    • ) - 关闭第一个捕获组。
  • (?: - 打开非捕获组。
    • -000 - 按字面意思匹配“-000”。
    • | - 用作或运算符的管道符号。
    • ( - 打开第二个捕获组。
      • -\d{3} - 匹配连字符和 3 位数字。
      • ) - 关闭第二个捕获组。
    • ) - 关闭非捕获组。
  • ( - 打开第三个捕获组。
    • (\d) - 匹配单个数字。
    • ) - 关闭第三个捕获组。
  • $ - 结束行 anchor 。

如果您想捕获没有连字符的第二组,请尝试:^(\d{5}-\d{5})-(?:000|(\d{3}))(\d)$

关于regex - 如何在 REGEX 表达式中间包含一个子字符串(除了精确的子字符串)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64822643/

相关文章:

regex - Notepad++ 正则表达式在下面使用特定文本查找并创建新行(同时保留找到的行)

javascript - 从数组中查找所有可能的匹配字符串和子字符串

regex - 如何使用 Perl 检查标量中是否包含已编译的正则表达式?

java - 如何使用Java从路径中获取路径参数

java - 用不在括号内的逗号分隔,跳过括号内的任何内容

php - 更好的 strip 化方法 php 正则表达式

javascript - 任何字符串的正则表达式,它采用 .pdf 之前的所有字符

node.js - 正则表达式搜索错误

java - 使用 RegExp 提取括号之间的值

php - 正则表达式从自定义代码创建 html