如何将字符串拆分为 Regex (C#) 的非常量
How can I split a string into non-constants of the Regex (C#)
我正在编写一个 Edifact Reader。一个 Edifact 文件由这样的字符串行组成:
string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";
有一组规则可以描述像这样的有效行。在这种特殊情况下,此规则的 RegEX 翻译如下所示:
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})?\'");
而且效果很好。但我也想将这个字符串分别拆分为 RegEx 中的非常量。结果应如下所示:
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);
}
}
可能比 abc
、digit0
、letterdigit0
更好的名称 :-) 解释 digit/letter 是什么的名称!
我正在编写一个 Edifact Reader。一个 Edifact 文件由这样的字符串行组成:
string row = @"ABC+1+E522017332:101111757+MAX:MUSTERMANN:16890224+9'";
有一组规则可以描述像这样的有效行。在这种特殊情况下,此规则的 RegEX 翻译如下所示:
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})?\'");
而且效果很好。但我也想将这个字符串分别拆分为 RegEx 中的非常量。结果应如下所示:
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);
}
}
可能比 abc
、digit0
、letterdigit0
更好的名称 :-) 解释 digit/letter 是什么的名称!