2016-12-07 33 views
2

我试图匹配一个模式,就像'[email protected]; 12345 @ 45; [email protected]'。我正在尝试Oracle(11g)REGEXP_LIKE函数要做到这一点。 这里是我的代码 -要检查指定的模式是否重复通过字符串的整个长度

SET SERVEROUTPUT ON;

开始

如果REGEXP_LIKE(TRIM( '[email protected]; 12345 @ 45; [email protected]'。),“[^ \ d + @((\ d + \ d {0,4}) '(\ d +)); $] +')

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

end;

对于上面的代码输出为“是”,这是我wanted.But这种码也返回“是”对图案像“12345 @ 5.6,12345 @ 45; [email protected](而不是在“5.6”之后我指定了逗号)。

它基本上是检查模式,但是如果它发现至少有一种这样的模式,则返回true并且不检查剩余的字符串以确保一切都在模式中。

我只想在字符串的整个长度内指定类型的模式。如果某些内容不符合模式,我需要返回'否'。

另如: -对于假设有一个字符串“ABC,ABC,ABC”我想检查模式“ABC”不仅存在于字符串中也重演通过整个字符串。 这意味着代码应该为'abc; bca; def' 等字符串返回false,并且只应为'abc; abc; abc'返回true。

要明确,我只是想检查指定的模式是否重复了整个字符串的长度,否则我想返回'否',不只是看到至少存在一个存在并返回true,我不知道有多少这种模式存在时代

希望我清楚,请帮助。谢谢。

+0

您的描述真的不是很清楚。试试''^ [0-9] + @ [0-9] +(\。[0-9] {0,4})?(; [0-9] + @ [0-9] +(\。 [0-9] {0,4})?)+ $''。如果它适合你,我会发布解释。请参阅[这里是如何工作的](https://regex101.com/r/y1y4hg/1)。 –

+0

我在第一个例子中看不到重复模式。你需要给出一个更精确的“模式”和“匹配”的定义。 – mathguy

+0

@Tejaduggirala - 好的,这样做更有意义。我用“数字”来表示你的意思是非负数(减号不允许),并且它必须在10位(没有十六进制数字,没有使用指数的科学记数法)。小数点如何...是.33允许的,或者在这种情况下是否必须是0.33?此外,是1.允许(整数1)? Oracle允许.33和1.作为数字 - 是否满足您的业务需求? – mathguy

回答

0

您可以使用

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

regex demo

在这个表达式你的主要组成部分是[0-9][email protected][0-9]+(\.[0-9]{0,4})? - 一个或多个数字,@,1+数字,然后一个可选(见(...)?分组结构与?量化符匹配1或0次出现)点(\.)和0到4位数字的序列([0-9]{0,4} - 如果您不想允许没有数字的点a从fterwards,替换01)。

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

^ + block + (  ; + block + )  +   $ 
     |     |  |    |  |   | 
    string    group sep    group 1 or more string 
    start    start     end occurrences end 
0

我认为这应该工作:

with 
    inputs (str) as (
     select '[email protected];[email protected];[email protected]' from dual union all 
     select '[email protected];[email protected],[email protected]' from dual 
    ) 
select str, 
     case when regexp_like(str, '^(\[email protected](\d+|\d*.\d+)(;|$))+$') then 'valid' 
      else 'invalid' end 
     as result 
from inputs 
; 


STR       RESULT 
---------------------------- ------- 
[email protected];[email protected];[email protected] valid 
[email protected];[email protected],[email protected] invalid 

^开头和$在年底保证整个字符串必须匹配(而不是从它的任何字符串,但所有的话)。倒数第二个字符+在匹配模式中需要重复一次或多次“模式”。您了解\[email protected]部分。然后有两个变化 - 允许一个整数或一个小数,并以分号或字符串的末尾结束。

这不允许像3.这样的东西作为模式的“第二部分”。另外,如果你的“第二部分”是一个IP地址,通常有四部分,而不是两部分,匹配模式将需要调整。如果您需要帮助,请回复。

相关问题