如何将字符串拆分为正则表达式 (C#) 的非常量



我正在编写一个Edifact Reader。一个Edifact文件由这样的字符串行组成:

string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";

有一组规则可以描述这样的有效行。在这种特殊情况下,此规则的正则表达式翻译如下所示:

Regex regex = new Regex(@"ABC+d{1}([A-Z0-9])?(:d{1})?+[A-Z0-9]{1,12}:[A-Z0-9]{9}+[A-Z0-9]{0,45}:[A-Z0-9]{0,45}:d{8}+d{1}(d{4})?(d{1})?([A-Z0-9]{1,7})?([A-Z0-9]{3})?([A-Z0-9]{15})?'");

而且效果很好。但我也想分别拆分这个字符串中的非常量。结果应如下所示:

ABC 
1
null
null
E522017332
101111757
MAX
MUSTERMANN
16890224
9
null
null
null
null
null

我该怎么做?

您只需使用捕获组(...)即可获得所需的所有部分:

Regex regex = new Regex(@"^(ABC)+(d{1})([A-Z0-9])?(:d{1})?+([A-Z0-9]{1,12}):([A-Z0-9]{9})+([A-Z0-9]{0,45}):([A-Z0-9]{0,45}):(d{8})+(d{1})(d{4})?(d{1})?([A-Z0-9]{1,7})?([A-Z0-9]{3})?([A-Z0-9]{15})?'$");
string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";
var match = regex.Match(row);
if (match.Success)
{
for (int i = 1; i < match.Groups.Count; i++)
{
string value = match.Groups[i].Value;
if (value == string.Empty)
{
value = "(null)";
}
Console.WriteLine(value);
}
}

现在Groups编号为1...很多。但它是相当不可读的...您可以给出明确的名称:

Regex regex = new Regex(@"^(?<abc>ABC)+(?<digit0>d{1})(?<lettersdigits0>[A-Z0-9])?(:d{1})?+([A-Z0-9]{1,12}):([A-Z0-9]{9})+([A-Z0-9]{0,45}):([A-Z0-9]{0,45}):(d{8})+(d{1})(d{4})?(d{1})?([A-Z0-9]{1,7})?([A-Z0-9]{3})?([A-Z0-9]{15})?'$");
string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";
var match = regex.Match(row);
if (match.Success)
{
{
string value = match.Groups["abc"].Value;
if (value == string.Empty)
{
value = "(null)";
}
Console.WriteLine(value);
}
{
string value = match.Groups["digit0"].Value;
if (value == string.Empty)
{
value = "(null)";
}
Console.WriteLine(value);
}
}

名字可能比abcdigit0letterdigit0更好:-(解释数字/字母是什么的名称!

最新更新