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