用于按字符数分割字符串的正则表达式

时间:2012-12-12 16:01:28

标签: c#

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

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

有什么建议吗?

2 个答案:

答案 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}(.*)$
  • `^。{10} =匹配字符串的前十个字符(但不捕获它们)
  • `(。*)$ =捕获所有剩余的字符,直到字符串结尾

修改

正如评论中指出的那样,您可以轻松地将这两个表达式合并为一个表达式。

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

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

值得注意的是,使用RegEx可能是一个很好的解决方案,因为匹配将告诉您最初的十个字符是否只是字母数字字符。如果您只是想要捕获前10个字符而不管它们是什么,那么RegEx就是过度杀伤。但是如果你想要验证,RegEx是一种很好的方法。虽然性能可以争论,但你已经在使用.NET,无论如何都会对性能产生影响。