Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle RegExp_Like用于两个重复数字_Sql_Regex_Oracle - Fatal编程技术网

Sql Oracle RegExp_Like用于两个重复数字

Sql 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

我想编写一个类似regexp_的函数,它将识别字符串是否由两个重复字符组成。它将只标识具有交替数字且仅由两个唯一数字组成的字符串,但唯一数字不能重复,它必须交替

要求:

正则表达式应与787的模式匹配,但不应与788的模式匹配 不应该考虑像000000000

这样的模式:你可以尝试:

^(..)\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条件。请参阅我的编辑。