为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式从一长串没有分区的代码中拆分不同的代码

正则表达式从一长串没有分区的代码中拆分不同的代码

C#
Cats萌萌 2023-05-14 16:11:38
我(基本上)有一个包含大约 600,000 个代码的文件。它们看起来像这样:HJ43EKU2当它们被存储/加载时,它们看起来像这样:BJX4700QHJ43EKU2KU89EJKM每个代码正好是 8 位数字。它们是字母数字 (aZ,0-9),没有重音符号或符号。所以这有效(用于拆分代码块):[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]但是有一个问题,因为某些格式的代码不是像这样的有效代码:MF93276H第 7 位不能是数字。这不会太糟糕,除非有一个例外,如果代码的第二位数字是N(或字母表中的后面),那么这会使代码再次有效。我如何对 REGEX 实施一些逻辑,以便它考虑到重新验证代码的规则的“例外”?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

在 C# 中,您可以使用一种已知技术,使用捕获组并稍后对其求值:


var rx = "[a-zA-Z0-9]N[a-zA-Z0-9]{4}[0-9][a-zA-Z0-9]|([a-zA-Z0-9]{6}[0-9][a-zA-Z0-9])|[a-zA-Z0-9]{6}[a-zA-Z][a-zA-Z0-9]";

var results = Regex.Matches("BJX4700QHJ43EKU2KU89EJKM", rx)

            .Cast<Match>()

            .Where(m => !m.Groups[1].Success)

            .Select(z => z.Value);

foreach (var s in results)

    Console.WriteLine(s);

请参阅C# 演示

正则表达式详细信息

  • [a-zA-Z0-9]N[a-zA-Z0-9]{4}[0-9][a-zA-Z0-9]- 第二个字符等于的有效代码模式N

  • |- 或者

  • ([a-zA-Z0-9]{6}[0-9][a-zA-Z0-9])- 第 1 组(如果匹配,丢弃它):无效代码模式

  • |- 或者

  • [a-zA-Z0-9]{6}[a-zA-Z][a-zA-Z0-9]- 有效的代码模式。

注意:如果N(或字母表中的后面)表示如果第二个字符是O.. ,则您需要P在第一个选项中替换为.ZN[N-Z]

代码详情

  • .Where(m => !m.Groups[1].Success)- 如果第 1 组不匹配,则匹配是有效代码,因此只获取那些

  • .Select(z => z.Value)- 仅在结果中保留整个匹配对象值文本。


查看完整回答
反对 回复 2023-05-14
?
莫回无

TA贡献1865条经验 获得超7个赞

我会使用替代结构:


var x = @"HJ43EKU2";

var match =

    Regex.Match(x, @"(?i)[a-z0-9](?([n-z])[a-z0-9]{7}|[a-z0-9]{5}[a-z][a-z0-9])");

var code = match.Value;

•(?i)使搜索不区分大小写


•(?(n-z))零宽度断言,检查第二个字符是N或“更多”


•[a-z0-9]{7}如果第 2 个字符为 N或更多,则允许第 7 个字符为数字


•[a-z0-9]{5}[a-z][a-z0-9]如果第 2 个字符不是 N或更多,则不允许第 7 个字符为数字


查看完整回答
反对 回复 2023-05-14
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我不能强烈反对这一点,但 .NET 实际上支持条件组,所以你可以这样做:


var pattern = "[a-zA-Z0-9](?:(?<n>N)|[a-zA-Z0-9-[nN]])[a-zA-Z0-9]{4}(?(n)[a-zA-Z0-9]|[a-zA-Z])[a-zA-Z0-9]";

Regex.IsMatch("MF93276H") // false

Regex.IsMatch("MN93276H") // true


查看完整回答
反对 回复 2023-05-14
  • 3 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信