我有一个2D条形码,我需要将其解析为两个不同的项目。我希望我的第一个表达式只读取前10个字符(数字和字母)。第二个表达式我希望忽略前10个字符,然后读取剩余的字符(数字,字母,_)。剩余的字符总数不一致。
以下是条形码读取的示例。 20P0000002_0_DP-3_TR_DEBIT
有什么建议吗?
答案 0 :(得分: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);
答案 1 :(得分:2)
对于你的第一个表达,你会使用它。
^([\dA-Za-z]{10})
^
=匹配字符串的开头(
=开始捕获组[
=开始匹配的字符集\d
=匹配所有数字(0-9)A-Za-z
=匹配所有大写和小写字母]
=结束字符集{10}
=完全匹配前一个字符集中的10个)
=结束捕获组对于你的第二个,这个
^.{10}(.*)$
修改强>
正如评论中指出的那样,您可以轻松地将这两个表达式合并为一个表达式。
^([\dA-Za-z]{10})(.*)$
这将产生两个捕获组,只有一个匹配操作。
值得注意的是,使用RegEx可能是一个很好的解决方案,因为匹配将告诉您最初的十个字符是否只是字母数字字符。如果您只是想要捕获前10个字符而不管它们是什么,那么RegEx就是过度杀伤。但是如果你想要验证,RegEx是一种很好的方法。虽然性能可以争论,但你已经在使用.NET,无论如何都会对性能产生影响。