检查指定的模式是否在整个字符串长度中重复

时间:2016-12-07 16:34:57

标签: oracle11g pattern-matching regexp-like

我正在尝试匹配类似于' 12345@5.6; 12345 @ 45; 12345@0.5'。我正在尝试使用Oracle(11g)REGEXP_LIKE函数来执行此操作。 这是我的代码 -

SET SERVEROUTPUT ON;

开始

如果regexp_like(TRIM(' 12345@5.6; 12345 @ 45; 12345@0.5'),' [^ \ d + @((\ d +。\ d {0,4} )|(\ d +)); $] +&#39)

then
dbms_output.put_line('yes');
else 
dbms_output.put_line('No');
end if;

端;

对于上面的代码输出是&#39;是&#39;这就是我想要的。但是这段代码也在回归&#39; yes&#39;对于像&#39; 12345 @ 5.6,12345 @ 45; 12345@0.5' 这样的模式(而不是半冒号我在&#39; 5.6&#39;之后指定了逗号)。< / p>

它基本上是检查模式,但是如果它找到至少一个这种模式,则返回true,而不是检查剩余的字符串以确保所有模式都在模式中。

我只想在字符串的整个长度上使用指定类型的图案。如果某些图案不合格,我需要返回&#39;否&#39;。

另一个例如: - 假设有一个字符串&#39; abc; abc; abc&#39;我想检查一下模式&#39; abc&#39;不仅存在于字符串中,而且还通过整个字符串重复自身。 这意味着代码应该返回false,例如&#39; abc; bca; def&#39; 并且只应为&#39; abc; abc; abc&#39;。

返回true

要清楚,我只想检查指定的模式是否在字符串的整个长度内重复,否则我想返回&#39;否&#39;,不只是看到至少一个存在并返回true并且我做不知道这种模式存在多少次。

希望我很清楚,请帮忙。谢谢。

2 个答案:

答案 0 :(得分:0)

我认为这应该有效:

with
     inputs ( str ) as (
       select '12345@5.6;12345@45;12345@0.5' from dual union all
       select '12345@5.6;12345@45,12345@0.5' from dual
     )
select str,
       case when regexp_like(str, '^(\d+@(\d+|\d*.\d+)(;|$))+$') then 'valid'
            else 'invalid' end
       as   result
from   inputs
;


STR                           RESULT
----------------------------  -------
12345@5.6;12345@45;12345@0.5  valid
12345@5.6;12345@45,12345@0.5  invalid

开头的^和结尾的$保证整个字符串必须匹配(不是来自它的任何子字符串,而是所有字符串)。匹配模式中倒数第二个字符+需要一次或多次重复&#34;模式&#34;。您了解\d+@部分。然后有两个替换 - 允许整数或小数,并以分号或字符串结尾结束。

这不允许像3.&#34;第二部分&#34;的模式。另外,如果您的第二部分&#34;是一个IP地址,通常有四个部分,而不是两个部分,需要调整匹配模式。如果您需要帮助,请回信。

答案 1 :(得分:0)

您可以使用

'^[0-9]+@[0-9]+(\.[0-9]{0,4})?(;[0-9]+@[0-9]+(\.[0-9]{0,4})?‌​)+$'

请参阅regex demo

此正则表达式中的主要构建块是[0-9]+@[0-9]+(\.[0-9]{0,4})? - 一个或多个数字,@,1个数字,然后是可选(请参阅{{1}分组构造与(...)?量词匹配1或0次出现)点序列(?)和0到4位数(\. - 如果您不想允许点如果之后没有数字,请将[0-9]{0,4}替换为0)。

然后,您要验证由这些块组成的整个字符串,并使用分号作为分隔符。你需要使用

1