检查指定模式是否在整个字符串长度中重复
To check if specified pattern is repeating through the entire length of string
我正在尝试匹配类似于“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;
结束;
对于上面的代码输出是 'Yes' 这就是我 wanted.But 这个代码也是 returning 'yes' 模式像 '12345 @5.6,12345@45;12345@0.5'(我在“5.6”后指定了逗号,而不是分号)。
它基本上是在检查模式,但如果它找到至少一种这种模式,这就是 returning true 并且不检查剩余的字符串以确保所有内容都在模式中。
我只想要 string.If 整个长度中指定类型的模式 我需要 return 'No'.
另一个例子:- 假设有一个字符串 'abc;abc;abc' 我想检查模式 'abc' 是否不仅存在于字符串中而且重复本身贯穿整个字符串。
这意味着对于像 'abc;bca;def' 这样的字符串,代码应该 return false
并且应该 return 只对 'abc;abc;abc'.
为真
明确地说,我只想检查指定的模式是否在整个字符串长度上重复,否则我想 return 'No',而不是只看到至少一个存在并且 return 是的,我不知道这种模式存在了多少次。
希望我清楚,请help.Thank你
我认为这应该可行:
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
开头的 ^
和结尾的 $
保证必须匹配整个字符串(不是其中的任何子字符串,而是所有字符串)。匹配模式中的倒数第二个字符 +
需要一次或多次重复 "pattern"。您了解 \d+@
部分。然后有两个交替 - 允许整数或小数,并以分号或字符串结尾结束。
这不允许类似 3. 作为模式的 "second part"。此外,如果您的 "second part" 是一个 IP 地址,通常有四个部分,而不是两个,则需要调整匹配模式。如果您需要这方面的帮助,请回信。
您可以使用
'^[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}
- 如果您不这样做之后想要允许没有数字的点,将 0
替换为 1
).
然后,您要验证由这些块组成的 整个 字符串,并以分号作为分隔符。你需要使用
^ + block + ( ; + block + ) + $
| | | | | |
string group sep group 1 or more string
start start end occurrences end
我正在尝试匹配类似于“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;
结束;
对于上面的代码输出是 'Yes' 这就是我 wanted.But 这个代码也是 returning 'yes' 模式像 '12345 @5.6,12345@45;12345@0.5'(我在“5.6”后指定了逗号,而不是分号)。
它基本上是在检查模式,但如果它找到至少一种这种模式,这就是 returning true 并且不检查剩余的字符串以确保所有内容都在模式中。
我只想要 string.If 整个长度中指定类型的模式 我需要 return 'No'.
另一个例子:- 假设有一个字符串 'abc;abc;abc' 我想检查模式 'abc' 是否不仅存在于字符串中而且重复本身贯穿整个字符串。 这意味着对于像 'abc;bca;def' 这样的字符串,代码应该 return false 并且应该 return 只对 'abc;abc;abc'.
为真明确地说,我只想检查指定的模式是否在整个字符串长度上重复,否则我想 return 'No',而不是只看到至少一个存在并且 return 是的,我不知道这种模式存在了多少次。
希望我清楚,请help.Thank你
我认为这应该可行:
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
开头的 ^
和结尾的 $
保证必须匹配整个字符串(不是其中的任何子字符串,而是所有字符串)。匹配模式中的倒数第二个字符 +
需要一次或多次重复 "pattern"。您了解 \d+@
部分。然后有两个交替 - 允许整数或小数,并以分号或字符串结尾结束。
这不允许类似 3. 作为模式的 "second part"。此外,如果您的 "second part" 是一个 IP 地址,通常有四个部分,而不是两个,则需要调整匹配模式。如果您需要这方面的帮助,请回信。
您可以使用
'^[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}
- 如果您不这样做之后想要允许没有数字的点,将 0
替换为 1
).
然后,您要验证由这些块组成的 整个 字符串,并以分号作为分隔符。你需要使用
^ + block + ( ; + block + ) + $
| | | | | |
string group sep group 1 or more string
start start end occurrences end