正则表达式防止某些范围

问题描述 投票:0回答:1

我目前有以下正则表达式

ZL[^0-9].{16}_.{3}PAD_N.{26}\.PIC

与类似的文件名匹配

ZLF_1177_0771428479_534PAD_N0530130SALP09217_1100LMV01.PIC

但想更改正则表达式,以便位置

SALP09217
处的 9 个字符 无法接受范围

SALP00000-00899, SALP01000-03099 and SALP05000-06999

以下正则表达式部分有效

ZL[^0-9].{16}_.{3}PAD_N.{7}(?!(SALP00[0-8][0-9][0-9])|(SALP0[1-3]0[0-9][0-9])|(SALP0[5-6][0-9][0-9][0-9])).*\.PIC

但将允许大于原始正则表达式允许的字符串。例如它允许

ZLF_1177_0771428479_534PAD_N0530130SALP09217_1100LMV01.PIC

这是正确的,但也

ZLF_1177_0771428479_534PAD_N0530130SALP09217_1100LMV01LARGER.PIC

这不是

“理想”的正则表达式是

ZL[^0-9].{16}_.{3}PAD_N.{7}(?!(SALP00[0-8][0-9][0-9])|(SALP0[1-3]0[0-9][0-9])|(SALP0[5-6][0-9][0-9][0-9])).{10}\.PIC

但是

ZLF_1177_0771428479_534PAD_N0530130SALP09217_1100LMV01.PIC

不会匹配。

有什么建议吗?

regex regex-lookarounds regex-negation
1个回答
0
投票

你可以使用

ZL[^0-9].{16}_.{3}PAD_N.{7}(?!SALP0(?:0(?:0{0,2}[0-9]|0?[1-9][0-9]|[1-8][0-9]{2})|(?:100[0-9]|10[1-9][0-9]|1[1-9][0-9]{2}|2[0-9]{3}|30[0-9]{2})|(?:500[0-9]|50[1-9][0-9]|5[1-9][0-9]{2}|6[0-9]{3}))).{19}\.PIC

请参阅 正则表达式演示

如果当前位置右侧紧邻 SALP00000-00899、SALP01000-03099 和 SALP05000-06999 范围,则

(?!SALP0(?:0(?:0{0,2}[0-9]|0?[1-9][0-9]|[1-8][0-9]{2})|(?:100[0-9]|10[1-9][0-9]|1[1-9][0-9]{2}|2[0-9]{3}|30[0-9]{2})|(?:500[0-9]|50[1-9][0-9]|5[1-9][0-9]{2}|6[0-9]{3})))
负向前视会使匹配失败。

注:

  • SALP00(?:0{0,2}[0-9]|0?[1-9][0-9]|[1-8][0-9]{2})
    匹配 SALP00000-00899,
  • SALP0(?:100[0-9]|10[1-9][0-9]|1[1-9][0-9]{2}|2[0-9]{3}|30[0-9]{2})
    匹配 SALP01000-03099 和
  • SALP0(?:500[0-9]|50[1-9][0-9]|5[1-9][0-9]{2}|6[0-9]{3})
    匹配 SALP05000-06999。
  • 另外,看看我如何将
    .{26}
    模式分为
    .{7}
    .{19}
    以使前瞻工作。
© www.soinside.com 2019 - 2024. All rights reserved.