Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字符串拆分为正则表达式(C#)的非常量_C#_Regex_Edifact - Fatal编程技术网

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

如何将字符串拆分为正则表达式(C#)的非常量,c#,regex,edifact,C#,Regex,Edifact,我正在编写一个Edifact阅读器。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})?

我正在编写一个Edifact阅读器。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
有一组规则描述这样的有效行。在这种特殊情况下,此规则的正则表达式翻译如下:

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
而且效果很好。但是我还想将这个字符串分别拆分为正则表达式中的非常量。结果应该如下所示:

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);
    }
}

可能比解释数字/字母是什么的
abc
digit0
letterdigit0
:-)更好的名称

你的正则表达式正好说明了正则表达式为什么是邪恶的。完全不可能看出作者的意图。什么是
null
?例如第一个([A-Z0-9])?=>无效的