2

我正在尝试匹配类似于“12345@5.6;12345@45;12345@0.5”的模式。我正在尝试使用 Oracle(11g) REGEXP_LIKE 函数来做到这一点。这是我的代码-

设置服务器输出;

开始

if regexp_like(TRIM('12345@5.6;12345@45;12345@0.5'),'[^\d+@((\d+.\d{0,4})|(\d+));$]+' )

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

结尾;

对于上面的代码输出是“是”,这就是我想要的。但是对于像“12345@5.6,12345@45;12345@0.5”这样的模式,这段代码也返回“是”(而不是分号,我在“之后指定了逗号” 5.6')。

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

我只想要字符串的整个长度中指定类型的模式。如果某些东西超出模式,我需要返回“否”。

另一个例子:-假设有一个字符串'abc;abc;abc'我想检查模式'abc'是否不仅存在于字符串中,而且还在整个字符串中重复。这意味着代码应该为像'abc;bca;def'这样的字符串返回false,并且应该只为'abc;abc;abc'返回true。

需要明确的是,我只想检查指定的模式是否在整个字符串长度中重复,否则我想返回“否”,不只是看到至少一个存在并返回 true,而且我不知道这种模式存在多少次.

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

4

2 回答 2

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

^开头和结尾的$保证必须匹配整个字符串(不是其中的任何子字符串,而是所有字符串)。匹配模式中的倒数第二个字符+需要“模式”的一个或多个重复。你明白那\d+@部分。然后有两种选择 - 允许整数或小数,并以分号或字符串结尾结尾。

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

于 2016-12-07T18:58:18.753 回答
0

您可以使用

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

查看正则表达式演示

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

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

      ^    +   block   + (      ;    + block  +  )       +         $
      |                  |      |                |       |         |
    string             group   sep             group 1 or more   string 
    start              start                    end  occurrences  end
于 2016-12-07T19:10:40.580 回答