正则表达式(不带“?”)匹配不包含特定字符串的行(错误#1139)

时间:2016-02-16 09:19:59

标签: php mysql regex

我需要:MySQL(php,PDO)用法的正则表达式。 Regexp应该找到括号[]之间的所有数字,但数字150除外。

所以我想得到:

[3]
[25464]
[510]

但我想排除:

[150]

我得到了什么:

\[{1}((?!150)[0-9])+\]{1}

它适用于最新版本的MySQL,但我需要的东西也适用于旧版本(可能是5.1)。

问题:目前我收到错误:

1139 - Got error 'repetition-operator operand invalid' from regexp

我知道我不能用?我怎样才能更换它?

其他信息(编辑): 我正在重新设计数据库,这就是我需要写这个

的原因

II编辑 - 为什么我需要这个: 我需要检索“content”列中包含仅指定一个 [150]的所有行。一列“内容”可以包含零[nr]或一个特定[nr]或许多不同[nrs]。

WHERE content REGEXP '\[{1}((?!150)[0-9])+\]{1}' = 0 AND content LIKE '%[150]%'

2 个答案:

答案 0 :(得分:1)

尝试这个,希望这有效。

 $string='[3]
 [25464]
 [510]
 [150]
 [100]';
 preg_match_all('/\[(?!150)\d+\]/', $string,$matches);
 print_r($matches);

这将使用括号匹配所有数字(150除外) $ matches [0] 将包含所需的结果......

答案 1 :(得分:0)

WHERE     x REGEXP '\[[[:digit:]]+\]'
  AND NOT x REGEXP '\[150\]'

然而,这将拒绝aaa[123]bbb[150]ccc。应该被拒绝吗? (请提供一些匹配/拒绝的样本数据。您的目标不是很明确。)

由于LIKEREGEXP快,所以速度会快一些:

WHERE x REGEXP '\[[[:digit:]]+\]'
  AND x NOT LIKE '%[150]%'