Sql Oracle RegExp_Like用于两个重复数字
我想编写一个类似regexp_的函数,它将识别字符串是否由两个重复字符组成。它将只标识具有交替数字且仅由两个唯一数字组成的字符串,但唯一数字不能重复,它必须交替 要求: 正则表达式应与787的模式匹配,但不应与788的模式匹配 不应该考虑像000000000Sql Oracle RegExp_Like用于两个重复数字,sql,regex,oracle,Sql,Regex,Oracle,我想编写一个类似regexp_的函数,它将识别字符串是否由两个重复字符组成。它将只标识具有交替数字且仅由两个唯一数字组成的字符串,但唯一数字不能重复,它必须交替 要求: 正则表达式应与787的模式匹配,但不应与788的模式匹配 不应该考虑像000000000 这样的模式:你可以尝试: ^(..)\1*$ 细分: ^ - assert beginning of line (..) - capture the first 2 characters \1* - repeat the cap
这样的模式:你可以尝试:
^(..)\1*$
细分:
^ - assert beginning of line
(..) - capture the first 2 characters
\1* - repeat the captured group pattern zero or more times
$ - assert end of line
未在oracle中测试…您可能会这样做-
SQL> WITH DATA AS(
2 SELECT '787878787' str FROM dual UNION ALL
3 SELECT '787878788' FROM dual
4 )
5 SELECT *
6 FROM DATA
7 WHERE REGEXP_LIKE(str, '(\d+?)\1')
8 AND SUBSTR(str, 1,1) = SUBSTR(str, -1, 1)
9 /
STR
---------
787878787
SQL>
因为您只处理数字,所以我使用了\d
\d+?将匹配数字,并且,\1是捕获的数字。AND条件中的substr正在检查字符串的第一位和最后一位是否相同
编辑:OP的附加要求
为了避免像00000000这样的数字,您需要向谓词添加NOT条件
SQL> WITH DATA AS
2 ( SELECT '787878787' str FROM dual
3 UNION ALL
4 SELECT '787878788' FROM dual
5 UNION ALL
6 SELECT '787878788' FROM dual
7 )
8 SELECT *
9 FROM DATA
10 WHERE REGEXP_LIKE(str, '(\d+?)\1')
11 AND SUBSTR(str, 1,1) = SUBSTR(str, -1, 1)
12 AND SUBSTR(str, 2,1) <> SUBSTR(str, -1, 1)
13 /
STR
---------
787878787
SQL>
我想你想要的是:
WITH t1 AS (
SELECT '787878787' AS str FROM dual
UNION
SELECT '787878788' AS str FROM dual
UNION
SELECT '7878787878' AS str FROM dual
UNION
SELECT '78' AS str FROM dual
)
SELECT * FROM t1
WHERE REGEXP_LIKE(str, '^(.)(.)(\1\2)*\1?$')
AND SUBSTR(str, 1, 1) != SUBSTR(str, 2, 1)
这将涵盖需求中提到的情况,其中字符串以其开头的相同字符结尾。如果只需要数字,请替换。在带有\d的正则表达式中
更新:
下面是正则表达式的分解方式:
^ = start of string
(.) = first character - can be anything - in parentheses to capture it and use it in a backreference
(.) = second character - can be anything
\1 = backreference to first captured group
\2 = backreference to second captured group
(\1\2)* = These should appear together zero or more times
\1? = The first captured group should appear zero or one times
$ = end of the string
希望这能有所帮助。感谢您的回复。不幸的是,在测试之后,它没有确定所需的值谢谢您的回复。此解决方案确实可以识别787的情况,但它也会返回所有相同数字的值,例如000000000。是否需要指定必须存在多个唯一数字?David,谢谢!您是否可以提供类似REGEXP_函数的每个部分的细分,以显示每个部分的功能,类似于gwillie在前面的一个响应中提供的功能。。?我理解子串部分,无需澄清。感谢您的回复。此解决方案确实可以识别787的情况,但它也会返回所有相同数字的值,例如000000000。是否仍然需要指定必须存在多个唯一数字?是的,您只需添加一个NOT条件。请参阅我的编辑。