正则表达式以获取除范围外的所有数字

时间:2015-03-10 08:35:58

标签: sql regex oracle plsql

我想获得一个列表IP地址,其最后3位数不在0到200的范围内。我尝试使用REGEXP_LIKE,如下所示。但它给了我错误的结果。

 select * from ip_data
 where REGEXP_LIKE(substr(ip_address,instr(ip_address,'.',1,3)+1),'[^0-200]');

似乎每个数字都与0-200个数字相匹配。

我想只使用REGEXP_LIKE,因为我要从另一个表格中取出范围,格式为[0-200]。

任何建议都会有很大的帮助。

3 个答案:

答案 0 :(得分:2)

使用 REGEXP_SUBSTR

SQL> WITH DATA AS(
  2  SELECT '127.0.0.1' ip FROM dual UNION ALL
  3  SELECT '127.0.0.201' ip FROM dual
  4  )
  5  SELECT * FROM DATA
  6  WHERE REGEXP_SUBSTR(ip,'[[:digit:]]{1,3}',1, 4)
  7  NOT BETWEEN 0 AND 200
  8  /

IP
-----------
127.0.0.201

SQL>

使用简单的 SUBSTR

SQL> WITH DATA AS(
  2  SELECT '127.0.0.1' ip FROM dual UNION ALL
  3  SELECT '127.0.0.201' ip FROM dual
  4  )
  5  SELECT * FROM DATA
  6  WHERE to_number(substr(ip,instr(ip,'.',1,3)+1))
  7  NOT BETWEEN 0 AND 200
  8  /

IP
-----------
127.0.0.201

SQL>

我会采用简单的SUBSTR方法,因为它占用资源较少,CPU利用率较低,因此性能更佳。

答案 1 :(得分:1)

您不需要正则表达式:

to_number(substr(ip_address,instr(ip_address,'.',1,3)+1)) not between 0 and 200

答案 2 :(得分:0)

这样的事情应该有效:

select ip_address from ip_data
where NOT REGEXP_LIKE(ip_address,'\.(([0-9])|([1-9][0-9])|([1][0-9][0-9])|(200))$');