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

Posted

技术标签:

【中文标题】正则表达式获取除范围外的所有数字【英文标题】:regular expression to get all numbers except in a range 【发布时间】:2015-03-10 08:35:57 【问题描述】:

我想获取最后 3 位不在 0 到 200 范围内的 IP 地址列表。我尝试如下使用 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] 格式存储的表中获取范围。

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

【问题讨论】:

【参考方案1】:

使用 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 利用率更低,因此性能更好。

【讨论】:

我只想使用 REGEXP_LIKE,因为我必须从另一个以 [0-200] 格式存储的表中获取范围。 不清楚你在问什么。你可以展示一个例子,编辑你的问题并添加一个小例子。输入一些输入数据并发布您想要的输出。【参考方案2】:

你不需要正则表达式:

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

【讨论】:

【参考方案3】:

这样的东西应该可以工作:

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

【讨论】:

以上是关于正则表达式获取除范围外的所有数字的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:匹配文本段落中除特定短语外的所有内容

android java 正则表达式匹配除一个字符外的所有字符

除三个句点(省略号)外的字母周围句点的正则表达式

python语言之正则

python正则表达式

除空字符串外的任何内容的正则表达式