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