0

我有一个二维条码,需要将其解析为两个不同的项目。我希望我的第一个表达式只读取前 10 个字符(数字和字母)。第二个表达式我希望忽略前 10 个字符,然后读取剩余的字符(数字、字母、_)。剩余的字符总数不一致。

这是条形码读取的示例。20P0000002_0_DP-3_TR_DEBIT

有什么建议么?

4

2 回答 2

10

你不需要正则表达式,String.Substring会做:

var first = barcode.Substring(0, 10);
var second = barcode.Substring(10);

然后,您可以检查第一部分是否只是字母和数字,但理论上不是 100% 准确

var isValid = first.All(char.IsLetterOrDigit);

或更平淡无奇

var acceptable = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var isValid = first.All(c => acceptable.IndexOf(c.ToUpper()) != -1);
于 2012-12-12T16:03:49.443 回答
2

对于您的第一个表达式,您将使用它。

^([\dA-Za-z]{10})
  • ^= 匹配字符串的开头
  • (= 开始捕获组
  • [= 开始匹配的字符集
  • \d= 匹配所有数字 (0-9)
  • A-Za-z= 匹配所有大写和小写字母
  • ]= 结束字符集
  • {10}= 完全匹配前一个字符集的 10 个
  • )= 结束捕获组

对于你的第二个,这个

^.{10}(.*)$
  • `^.{10} = 匹配字符串的前十个字符(但不捕获它们)
  • `(.*)$ = 捕获所有剩余字符直到字符串结尾

编辑:

正如评论中所指出的,您可以像这样轻松地将这两个表达式组合成一个。

^([\dA-Za-z]{10})(.*)$

这将产生两个捕获组,只有一个匹配操作。

值得注意的是,使用 RegEx 可能是一个很好的解决方案,因为匹配会告诉您前十个字符是否只是字母数字字符。如果您只想捕获前十个字符而不管它们是什么,那么正则表达式就过分了。但是如果你想要验证,RegEx 是一个很好的方法。尽管性能可能存在争议,但您已经在使用 .NET,它无论如何都会对性能产生一些影响。

于 2012-12-12T16:07:26.020 回答