Skip to main content
 首页 » 编程设计

c#之长正则表达式之你会怎么做

2024年01月13日4052php

大家好,我有一个很长的正则表达式,很难看。 我想知道你是否可以帮助缩短它,这样它更易于管理。 我承认,我不是正则表达式大师,我只是偷偷摸摸地过日子。如果您想出了更好的方法(甚至不必更短),请解释您的推理,这样我可能会更好地理解您使用的技术。

正则表达式:

^([a-zA-Z0-9# ]+)-([a-zA-Z ]*)([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_ ]+)-([a-zA-Z0-9_ ]+)-([a-zA-Z ~]+)([a-zA-Z0-9_ ]+)\.rpt$ 

测试:

TESTFIX - ABCD 10118 - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 91.rpt 
TESTFIX - EFGD 10118 - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 92.rpt 
TESTFIX - 10118_14041 M - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 93.rpt 
TESTFIX - ABCD 10118 - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 93.rpt 
TESTFIX - EFGD 10118 - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 93.rpt 
TESTFIX - EFGD 10118 - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 93.rpt 
TESTFIX - ABCD 10118 - E008 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ 93.rpt 
#1REALLYLONGNAME - 10244 - E011 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - DX ~ ALPHALTR.rpt 
#1 LIVEREP - 10045 - E011 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ SING.rpt 
#2 LIVEREP - 10045 M - E011 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ MUL.rpt 
WELLREP - WELL10000 - E011 - E009 - IXX - IXX - IXX - IXX - IXX - IXX - SX ~ CLT.rpt 

每个部分由“-”字符序列分隔。 所有部分都可以包含空格和任何有效的文件名字符

每个部分都必须进行组捕获 如果重要的话,我会在 C# 中使用这个正则表达式

请您参考如下方法:

首先,获得一个好的正则表达式开发工具。我最喜欢的是Expresso .

这是一个清理过的版本:

^[\w# ]+ - [a-zA-Z ]*(?:[\w_ ]+ - ){9}[a-zA-Z]+ ~[\w_ ]+\.rpt$ 

变化包括:

  • 删除了捕获分组“()”- 我假设你只是 验证文本,因为你没有 提及任何捕获。如果你需要 他们,他们很容易加回去
  • 使用字母数字字符类 - "\w"等同于 "[a-zA-Z0-9]"
  • 将中间的重复部分替换为“(?:[\w_ ]+ - ){9}” 这匹配 ([alphanumeric underscore space]+ - ) 九次。由于我在第一个括号后面加上了“?:”,所以它没有捕获。

编辑:

这里是捕获组:

^([\w# ]+) - ([a-zA-Z ]*)(?:([\w_ ]+) - ){9}([a-zA-Z]+) ~ ([\w_ ]+)\.rpt$ 

请注意,当您遍历编号的捕获组时,第三个捕获组将包含 9 个捕获。