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