.net 正则表达式:匹配字符但从模式中排除

.net 正则表达式:匹配字符但从模式中排除,.net,regex,barcode,.net,Regex,Barcode,我有一个条形码,我正试图通过我们的文档成像软件中的内置正则表达式来解析,我相信是在.net中。这些是贷款文档上的条形码,包括由破折号(-)分隔的账号和子账号。其中最困难的部分是,随着子账号的缩减,账号将被零填充以进行补偿。下面的一些示例显示帐户/子帐户编号从位置11开始,持续15个字符(包括破折号)。我需要两个不同的正则表达式模式(一个匹配破折号之前的帐号,另一个匹配破折号之后的帐号)。所有示例中的前10个零实际上是当前未使用的另一个字段。因此,匹配之前的所有内容-将在短期内起作用,但如果他们决

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

0000000000 123456789-1234513330 2014

账户=123456789 sub=12345

00000000000123456789-1234133304302014

账户=0123456789 sub=1234

000000000000123456789-123133304302014

账户=00123456789 sub=123

0000000000000 123456789-12133304302014

账户=000123456789 sub=12

00000000000000 123456789-1133304302014

账户=0000123456789 sub=1

编辑:

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

账号=[1-9]。(?=。-)

子账户号=(?

(\d+)(?:-)(\d+)
这有两个捕获组,由“不捕获”连字符分隔

您可能不需要
(:?)
部分-可能只是
-
工作

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

  • 要在使用dash之前捕获帐号,请执行以下操作:

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

  • 要捕获dash使用后的数据,请执行以下操作:

    -(\d+)

  • 如果您想同时捕获这两个选项,请使用:

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


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

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

    parsed_numbers = account_string.match( /(\d+)-(\d+)/ )
    if parsed_numbers
      account_number = parsed_numbers[ 1 ]
      sub_account_number = parsed_numbers[ 2 ]
    end
    
    ^(\d+)-
    将匹配前半部分(帐号)

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


    -(\d+)$
    将匹配下半部分(子帐户)。

    根据修订后的说明,这将捕获两个单独的组中的11到25个字符,在破折号上拆分(不包括破折号)。前导10位字段和尾随12位字段将被丢弃

    \d{10}(\d+)-(\d+)\d{12}
    
    如果将来还需要捕获其组中的前导字段和尾随字段:

    (\d{10})(\d+)-(\d+)(\d{12})
    
    如果需要,可以通过匹配零或多个前导零来删除帐号上的零填充:

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

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

    你能给出你使用的语言吗?这样我们就可以提供一个完整的答案,并给出具体的行?我之所以这样问,是因为有些语言使用不同的语法来识别捕获的元素。如果你告诉我们你使用的是什么文档成像软件,并指向它的正则表达式引擎的文档,可能会有所帮助。你得到了一些很好的建议estions,但为了真正提供帮助,我们需要了解更多关于该平台的详细信息。抱歉,我不太清楚。我会看看是否可以找到任何文档,但我还没有在任何地方看到。该软件通过Integra Business Systems。此外,上述每个示例中的帐号是123456789,子帐号是两个帐户之间的号码-和133304302014。结束数字字符串不是静态的。我将更新问题以使其更清晰。我更新了问题以将语言引擎包含为.Net.+1,用于处理填充。小调整:The
    [1-9]
    并非绝对必要,因为贪心匹配将在字符串中的第一个非零字符处停止。
    0*(\d+)-(\d+)
    足够了。在回答中添加了我的假设。如果假设不正确,并且允许帐户以零开头,但总是九位数,我们可以使用
    0*(\d{9})-(\d+)
    谢谢。这似乎是我所需要的最佳答案。不幸的是,它在软件中似乎不起作用。我知道在没有任何文档的情况下,您没有太多工作要做。我必须提交一份支持票。希望他们会有一个(免费)答案。谢谢您的帮助!您可以尝试替换
    [0-9]
    用于
    \d
    ,和/或转义括号,例如第三个示例的
    \([0-9]{10}\)0*\([0-9]+\)-\([0-9]{12}\)