【问题标题】:Regex: Match character but exclude from pattern正则表达式:匹配字符但从模式中排除
【发布时间】:2014-06-05 22:22:35
【问题描述】:

我有一个条形码,我正试图通过我们的文档成像软件中的内置正则表达式进行解析,我相信该软件位于 .net 中。这些是贷款文件上的条形码,包括由破折号 (-) 分隔的帐号和子帐号。这其中最难的部分是,随着子账号的缩小,账号是补零的那个。下面的一些示例显示了帐户/子帐户编号从位置 11 开始并持续 15 个字符(包括破折号)。我需要两种不同的正则表达式模式(一种匹配破折号之前的帐号,另一种匹配后面的)。所有示例中的前 10 个零实际上是另一个当前未使用的字段。因此,在 - 之前匹配所有内容将在短期内起作用,但如果他们决定开始使用该字段,它将不再起作用。我需要一些方法来解析它,这将使我在破折号上的位置 11-25 分裂。我可以在子帐号上包含破折号,在帐号上包含零,因为我可以在软件中选择“删除所有出现的 __ 字符”。我可以自动删除帐户中的前导零和子帐户中的前导破折号。

0000000000123456789-12345133304302014

帐号=123456789 子=12345

00000000000123456789-1234133304302014

帐户=0123456789 子=1234

000000000000123456789-123133304302014

帐户=00123456789 子=123

0000000000000123456789-12133304302014

帐户=000123456789 子=12

00000000000000123456789-1133304302014

帐户=0000123456789 子=1

编辑:

最终的工作正则表达式语法如下:

帐号 = [1-9].(?=.-)

子账号=(?(?=(............$))*

【问题讨论】:

  • 您能否提供您正在使用的语言,以便我们提供包含特定行的完整答案?我问只是因为某些语言使用不同的语法来识别捕获的元素。
  • 如果您告诉我们您正在使用什么文档成像软件,并指出其正则表达式引擎的文档,这可能会有所帮助。您得到了一些很好的建议,但要真正帮助我们,我们需要了解有关该平台的更多详细信息。
  • 对不起,我不是更清楚。我会看看是否可以找到任何文档,但我还没有在任何地方看到它。该软件通过 Integra Business Systems 提供。此外,上述每个示例中的帐号都是 123456789,子帐号是 - 和 133304302014 之间的数字。结束数字字符串不是静态的。我会更新问题以使其更清楚。
  • 我更新了问题,将语言引擎包含为 .Net。

标签: .net regex barcode


【解决方案1】:

根据修改后的描述,这将在两个单独的组中捕获字符 11 到 25,并在(但不包括)破折号上分开。前 10 位字段和后 12 位字段被丢弃。

\d{10}(\d+)-(\d+)\d{12}

如果将来您还需要在自己的组中捕获前导和尾随字段:

(\d{10})(\d+)-(\d+)(\d{12})

如果您愿意,可以通过匹配零个或多个前导零来删除帐号上的零填充:

(\d{10})0*(\d+)-(\d+)(\d{12})

(这些解决方案假定第一个和最后一个字段的长度是固定的。)

【讨论】:

  • 谢谢。这似乎是我需要的最佳答案。不幸的是,它似乎在软件中不起作用。我知道如果没有任何文档,您就没有太多工作要做。我必须提交支持票。希望他们会有一个(免费的)答案。感谢您的帮助!
  • 您可以尝试将[0-9] 替换为\d,和/或转义括号,例如\([0-9]{10}\)0*\([0-9]+\)-\([0-9]\)\([0-9]{12}\) 第三个例子。
【解决方案2】:

怎么样

(\d+)(?:-)(\d+)

这有两个由“不捕获”连字符分隔的捕获组

您可能不需要 (:?) 部分 - 可能只是 - 有效。

具体细节取决于正则表达式的实现

【讨论】:

    【解决方案3】:

    下面的示例是针对 Ruby 的,但如果您需要其他语言,请告诉我。

    parsed_numbers = account_string.match( /(\d+)-(\d+)/ )
    if parsed_numbers
      account_number = parsed_numbers[ 1 ]
      sub_account_number = parsed_numbers[ 2 ]
    end
    

    【讨论】:

      【解决方案4】:

      ^(\d+)- 将匹配前半部分(帐号)。

      如果您不想要任何零,^0*(\d+)- 将匹配前半部分。

      -(\d+)$会匹配下半部分(子账号)。

      【讨论】:

        【解决方案5】:
        1. 要在破折号使用之前捕获帐号:

          0*([1-9]\d*)-

        2. 并在破折号后使用:

          -(\d+)

        3. 如果您想同时捕获两者,请使用:

          0*([1-9]\d*)-(\d+)

        假设:由于0是用来“补偿”的,所以帐号不能以0开头。

        【讨论】:

        • +1 用于处理填充。小调整:[1-9] 不是绝对必要的,因为0* 贪婪匹配无论如何都会在字符串中的第一个非零字符处停止。 0*(\d+)-(\d+) 就足够了。
        • 在答案中添加了我的假设。
        • 如果假设不成立,账户可以从零开始但总是九位,我们可以使用0*(\d{9})-(\d+)
        猜你喜欢
        • 2011-03-01
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多