Regex 是否有一种正则表达式技术可以将邮政编码与一对转置的数字进行匹配?

Regex 是否有一种正则表达式技术可以将邮政编码与一对转置的数字进行匹配?,regex,oracle,Regex,Oracle,最好使用Oracle语法,我需要匹配美国邮政编码(5位数字),其中一对数字已被转换 这可以用正则表达式实现吗 如果是这样,正则表达式会是什么样子 编辑: 将两个连续的数字进行换位 12345=12345或12354或12435或13245或21345不确定oracle,但您可以将您的字符串附加到已知字符串,如匹配12345,并使用此模式: \b((\d)(\d)(\d)(\d)(\d))\b(?=.*?match: (?:\2\3\4\6\5|\2\3\5\4\6|\2\4\3\5\6|\3\2

最好使用Oracle语法,我需要匹配美国邮政编码(5位数字),其中一对数字已被转换

这可以用正则表达式实现吗

如果是这样,正则表达式会是什么样子

编辑:


将两个连续的数字进行换位


12345=12345或12354或12435或13245或21345

不确定oracle,但您可以将您的字符串附加到已知字符串,如
匹配12345
,并使用此模式:

\b((\d)(\d)(\d)(\d)(\d))\b(?=.*?match: (?:\2\3\4\6\5|\2\3\5\4\6|\2\4\3\5\6|\3\2\4\5\6))  

不确定oracle,但您可以将字符串附加到已知字符串,如
匹配12345
,并使用以下模式:

\b((\d)(\d)(\d)(\d)(\d))\b(?=.*?match: (?:\2\3\4\6\5|\2\3\5\4\6|\2\4\3\5\6|\3\2\4\5\6))  

我谨此陈辞,真正的解决方案是首先不允许出现坏数据,否则您将永远无法创建奇怪且难以维护的代码,以允许用户(祝福他们的心)以任何奇怪的方式进入。也许您可以运行一个“清理”例程,不时修复错误的拉链,这样您的选择代码就不必跳转了。这样,如果其他人需要使用这些数据,那么表中的数据是干净的,他们也不需要跳转

在之前的一份工作中,我们每季度从美国邮局收到一张zipcode CD,数据被加载到表格中。位于这些表顶部的应用程序在数据输入点引用了它们,并确保输入了有效的zip。也许这是一种选择

在我目前的工作中,我们有一个过程,其中地址是地理编码的,除了获得纬度和经度外,该过程还返回正确的美国邮局格式的地址,包括固定的邮政编码。好极了

稍加搜索也会发现一些服务,这些服务可以让您通过与web服务或类似的东西交互来验证输入的地址


主要的一点是,你有更高层次的问题,应该解决这个问题。如果数据来自封闭的供应商系统,则当发现错误拉链时,应通过某种异常报告向来源报告以进行修复,从而纠正错误拉链。

我恭敬地提出,真正的解决方案是首先不允许出现错误数据,否则,您将永远无法创建奇怪且难以维护的代码,以允许用户(祝福他们的心)以任何奇怪的方式进入。也许您可以运行一个“清理”例程,不时修复错误的拉链,这样您的选择代码就不必跳转了。这样,如果其他人需要使用这些数据,那么表中的数据是干净的,他们也不需要跳转

在之前的一份工作中,我们每季度从美国邮局收到一张zipcode CD,数据被加载到表格中。位于这些表顶部的应用程序在数据输入点引用了它们,并确保输入了有效的zip。也许这是一种选择

在我目前的工作中,我们有一个过程,其中地址是地理编码的,除了获得纬度和经度外,该过程还返回正确的美国邮局格式的地址,包括固定的邮政编码。好极了

稍加搜索也会发现一些服务,这些服务可以让您通过与web服务或类似的东西交互来验证输入的地址


主要的一点是,你有更高层次的问题,应该解决这个问题。如果数据来自封闭的供应商系统,则当发现错误拉链时,应该有一个过程来纠正错误拉链,方法是通过某种异常报告向来源报告以进行修复。

我决定放弃正则表达式,并编写了一个特殊用途的PL/SQL函数。它似乎起作用了

这里是函数

  FUNCTION CHECK_ZIP_TRANSPOSE(IN_ZIP1 VARCHAR2, IN_ZIP2 VARCHAR2) RETURN BINARY_INTEGER DETERMINISTIC
  AS
    TEMP_STRING VARCHAR2(100) := IN_ZIP1||IN_ZIP2;
    I BINARY_INTEGER := 0;
    TEMP_ZIP1 VARCHAR2(6) := '|' || SUBSTR(IN_ZIP1,1,5);
  BEGIN
    IF LENGTH(TEMP_STRING) != 10 OR 
       LENGTH(TRIM(TRANSLATE(TEMP_STRING, ' +-.0123456789', ' '))) IS NOT NULL
    THEN 
      RETURN 0;
    END IF;
    IF MOD(ABS(TO_NUMBER(IN_ZIP1) - TO_NUMBER(IN_ZIP2)),9) != 0
    THEN
      RETURN 0;
    END IF;
    TEMP_STRING := NULL;
    FOR I IN 2..5
    LOOP
      TEMP_STRING := TEMP_STRING || SUBSTR(TEMP_ZIP1,1,I-1) || SUBSTR(TEMP_ZIP1,I+1,1) || SUBSTR(TEMP_ZIP1,I,1) || SUBSTR(TEMP_ZIP1,I+2);
    END LOOP;
    IF INSTR(TEMP_STRING,IN_ZIP2) > 0
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END CHECK_ZIP_TRANSPOSE;

我决定放弃正则表达式,并编写了一个特殊用途的PL/SQL函数。它似乎起作用了

这里是函数

  FUNCTION CHECK_ZIP_TRANSPOSE(IN_ZIP1 VARCHAR2, IN_ZIP2 VARCHAR2) RETURN BINARY_INTEGER DETERMINISTIC
  AS
    TEMP_STRING VARCHAR2(100) := IN_ZIP1||IN_ZIP2;
    I BINARY_INTEGER := 0;
    TEMP_ZIP1 VARCHAR2(6) := '|' || SUBSTR(IN_ZIP1,1,5);
  BEGIN
    IF LENGTH(TEMP_STRING) != 10 OR 
       LENGTH(TRIM(TRANSLATE(TEMP_STRING, ' +-.0123456789', ' '))) IS NOT NULL
    THEN 
      RETURN 0;
    END IF;
    IF MOD(ABS(TO_NUMBER(IN_ZIP1) - TO_NUMBER(IN_ZIP2)),9) != 0
    THEN
      RETURN 0;
    END IF;
    TEMP_STRING := NULL;
    FOR I IN 2..5
    LOOP
      TEMP_STRING := TEMP_STRING || SUBSTR(TEMP_ZIP1,1,I-1) || SUBSTR(TEMP_ZIP1,I+1,1) || SUBSTR(TEMP_ZIP1,I,1) || SUBSTR(TEMP_ZIP1,I+2);
    END LOOP;
    IF INSTR(TEMP_STRING,IN_ZIP2) > 0
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END CHECK_ZIP_TRANSPOSE;

我同意加里对这件事的看法。另外,我看了alpha bravo的答案,这个借来的是这个人的答案

假设子查询factoring子句产生一个邮政编码,我们正在寻找匹配的排列(如您所识别的)

然后,我创建了一个邮政编码接口表(一个不干净的表,我们希望通过记录挑选并检查匹配项)

我使用regexp替换方法,如下所示:

SCOTT@tst> CREATE TABLE scott.zip_data_interface AS
  2  SELECT TO_CHAR(object_id) zip_code
  3  FROM all_objects
  4  WHERE object_id BETWEEN 50000 AND 59999
  5  /

Table created.
  1    WITH z_code AS (
  2          SELECT '53211' zip
  3            FROM dual
  4         )
  5  SELECT z_code.zip, zdi.zip_code
  6    FROM z_code
  7    JOIN (
  8          SELECT zip,
  9                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\2\3\4\5') zip_perm
 10            FROM z_code
 11           UNION ALL
 12          SELECT zip,
 13                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\2\1\3\4\5') zip_perm
 14            FROM z_code
 15           UNION ALL
 16          SELECT zip,
 17                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\3\2\4\5') zip_perm
 18            FROM z_code
 19           UNION ALL
 20          SELECT zip,
 21                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\2\4\3\5') zip_perm
 22            FROM z_code
 23           UNION ALL
 24          SELECT zip,
 25                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\2\3\5\4') zip_perm
 26            FROM z_code
 27         ) zip_permutation
 28      ON z_code.zip = zip_permutation.zip
 29    JOIN zip_data_interface zdi
 30*     ON zip_permutation.zip_perm =zdi.zip_code
SCOTT@tst> /

ZIP   ZIP_CODE
===== ========================================
53211 52311
53211 53121
53211 53211
53211 53211

我同意加里对这件事的看法。另外,我看了alpha bravo的答案,这个借来的是这个人的答案

假设子查询factoring子句产生一个邮政编码,我们正在寻找匹配的排列(如您所识别的)

然后,我创建了一个邮政编码接口表(一个不干净的表,我们希望通过记录挑选并检查匹配项)

我使用regexp替换方法,如下所示:

SCOTT@tst> CREATE TABLE scott.zip_data_interface AS
  2  SELECT TO_CHAR(object_id) zip_code
  3  FROM all_objects
  4  WHERE object_id BETWEEN 50000 AND 59999
  5  /

Table created.
  1    WITH z_code AS (
  2          SELECT '53211' zip
  3            FROM dual
  4         )
  5  SELECT z_code.zip, zdi.zip_code
  6    FROM z_code
  7    JOIN (
  8          SELECT zip,
  9                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\2\3\4\5') zip_perm
 10            FROM z_code
 11           UNION ALL
 12          SELECT zip,
 13                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\2\1\3\4\5') zip_perm
 14            FROM z_code
 15           UNION ALL
 16          SELECT zip,
 17                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\3\2\4\5') zip_perm
 18            FROM z_code
 19           UNION ALL
 20          SELECT zip,
 21                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\2\4\3\5') zip_perm
 22            FROM z_code
 23           UNION ALL
 24          SELECT zip,
 25                 REGEXP_REPLACE(z_code.zip, '^(\d)(\d)(\d)(\d)(\d)$', '\1\2\3\5\4') zip_perm
 26            FROM z_code
 27         ) zip_permutation
 28      ON z_code.zip = zip_permutation.zip
 29    JOIN zip_data_interface zdi
 30*     ON zip_permutation.zip_perm =zdi.zip_code
SCOTT@tst> /

ZIP   ZIP_CODE
===== ========================================
53211 52311
53211 53121
53211 53211
53211 53211

举个例子会更好。假设您给定的邮政编码是12345,那么您希望匹配21345或52341或13245,而不是12345或54321?将两个连续数字进行换位;12345=12345或12354或12435或13245或21345我想得越多,我觉得正则表达式越不适合这个任务(除非你想拼出所有可能的匹配项:
^(12345 12445 12445 12435 12454)$
)…因为我根本不精通正则表达式,我想我会问。我可以通过寻找一个2位数的差(其中任意两位数不同)来接近这个数字差,这个数字差可以被9整除。或者,通过一次一个地遍历5个数字,并查看前后的数字。举个例子会更好。假设您给定的邮政编码是12345,那么您希望匹配21345、52341或13245,而不是12345或54321?将两个连续数字进行换位;12345=12345或12354或12435或13245或21345我想得越多,我认为正则表达式越不适合此任务(除非您想详细说明所有可能的匹配:
^(12345 12445 | 13245 12435|