Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php regexp:can';不排除一个元素_Php_Regex - Fatal编程技术网

php regexp:can';不排除一个元素

php regexp:can';不排除一个元素,php,regex,Php,Regex,我正在尝试设置一个相当复杂的regexp,但我无法从not match列表中仅避免一个元素 我的正则表达式是: 1234567-8_abc((?!_ABC|_DEFGHI)[\w]?)*(\.ios|\.and) 我必须排除的是: 1234567-8_abc.ios 1234567-8_abc_DEFGHI.ios 1234567-8_abc_abc.ios 相反,我必须包括: 1234567-8_abc_1UP.ios 1234567-8_abc_FI.ios 1234567-8_ab

我正在尝试设置一个相当复杂的regexp,但我无法从not match列表中仅避免一个元素

我的正则表达式是:

1234567-8_abc((?!_ABC|_DEFGHI)[\w]?)*(\.ios|\.and)
我必须排除的是:

  • 1234567-8_abc.ios
  • 1234567-8_abc_DEFGHI.ios
  • 1234567-8_abc_abc.ios
相反,我必须包括:

  • 1234567-8_abc_1UP.ios
  • 1234567-8_abc_FI.ios
  • 1234567-8_abc_gmg.ios
  • 1234567-8_abc_1UP和
  • 1234567-8_abc_FI和
  • 1234567-8_abc_gmg和
  • 1234567-8_abc_ddd和
  • 1234567-8_abc_qwert.ios
  • 1234567-8_abc_88.ios
我不能排除第一个选项(1234567-8_abc.ios

我试过了

我怎样才能做到这一点


谢谢大家!

添加一个如下所示的负前瞻

1234567-8_abc(?!_ABC|_DEFGHI)\w+(\.ios|\.and)


(?!\u ABC|u DEFGHI)
反向前瞻断言
\u ABC
后面的字符串不会是
\u ABC
\u DEFGHI
。并且它必须在
.ios
之前有一个或多个单词字符。因此它与这个
1234567-8_abc.ios
字符串不匹配。

这个正则表达式与PHP中的示例匹配:

1234567-8_abc_((?!ABC|DEFGHI)[\w]?)*(\.ios|\.and)

您可以使用以下模式:

1234567-8_abc_[^_.]++(?<!_ABC|_DEFGHI)\.(?:ios|and)
1234567-8_abc.[^.]++(?)?
注意:我假设
\uuu
.ios
之间的每个子字符串不包含点或下划线

必须使用
++
,以减少可能的回溯步骤,从而更快地失败

1234567-8_abc(?:(?!_ABC|_DEFGHI)\w)+(\.ios|\.and)
尝试此操作。您的正则表达式在
1234567-8_abc
可选之后保留了
\w
。只是将其设置为强制。请参阅演示


只是一个小提示:
[\w]
可以是
\w