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

时间:2014-04-21 19:26:44

标签: .net regex barcode

我有一个条形码我试图通过内置的正则表达式解析我们的文档成像软件,我相信它是在.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]。(?=。 - )

子帐号= (?< = - )。(?=(............ $))*

5 个答案:

答案 0 :(得分:0)

怎么样

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

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

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

确切的细节取决于正则表达式的实现

答案 1 :(得分:0)

  1. 要在短划线使用前捕获帐号:

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

  2. 并使用以下内容捕获一个:

    - (\ d +)

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

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

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

答案 2 :(得分:0)

底部示例适用于Ruby,但如果您需要其他语言,请告诉我。

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

答案 3 :(得分:0)

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

如果你不想要任何零,

^0*(\d+)-将匹配前半部分。

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

答案 4 :(得分:0)

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

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

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

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

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

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

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