正则表达式:不包括特定数字的数字范围

RegEx: number range excluding specific number

我正在努力寻找有关如何使用正则表达式匹配一系列数字但不包括一个数字的答案

即:我正在寻找 - AM19/0601 - AM19/0805 的任何匹配项(但不是 AM19/0803)

我正在使用它来查看是否有任何匹配:

AM19/6XX AM19/7XX AM19/8XX

/AM19\/0[678]

如:

if (preg_match('/AM19\/0[678]/', $perm) === 0) {
    //do whatever
}

但是如何 'exclude' AM19/803 选项不 return/or 包含在 match/search 中?

您可以在正则表达式中使用否定前瞻断言:

~\bAM19/0(?!803)[678]\d{2}\b~

RegEx Demo

这里我们在匹配 19/0 之后有一个否定的前瞻 (?!803) 如果 803 出现在输入的 19/0 之后,匹配将失败。

另请注意,通过使用备用正则表达式定界符 ~,您可以避免在正则表达式中转义 /

你可以使用

\bAM19/(?!0803)\d+

甚至

(?:AM19/0803)(*SKIP)(*FAIL)|AM19/\d+

后者可能有点过头了,见a demo on regex101.com

你不需要消极的前瞻性或类似的东西。方括号可以接受多个范围(例如 [a-zA-Z])。您可以使用多个数字范围忽略不需要的号码。

解法: AM19\/0[6-8][0-9][0-24-9]

Regex101: https://regex101.com/r/6Zc6br/3