我有一个试图用正则表达式解析的缓冲区。
这是缓冲区的示例:
DATA#ALPHAONE;BETATWO.CHARLIETHREE!
格式为:缓冲区始终以“DATA#”开头,作为文字标头。之后,它将有一个或多个文本字段,由分号、句点或感叹号分隔。
到目前为止,我的正则表达式模式(在 C# 中)是:
string singleFieldPattern = "(?'Field'.*?)(?'Separator'[;.!])";
string fullBufferPattern = "(?'Header'DATA#)(" + singleFieldPattern + ")+";
当我尝试转储匹配的数据时,问题就来了:
Regex response = new Regex(fullBufferPattern);
string example = "DATA#ALPHAONE;BETATWO.CHARLIETHREE!";
Debug.WriteLine("RegEx Matches?: {0}", response.IsMatch(example));
foreach (Match m in response.Matches(example))
{
foreach(string s in new string[]{"Header", "Field", "Separator"})
{
Debug.WriteLine("{0} : {1}", s, m.Groups[s]);
}
}
唯一的输出是:
RegEx Matches?: True
Header : DATA#
Field : CHARLIETHREE
Separator : !
我打算输出是:
RegEx Matches?: True
Header : DATA#
Field : ALPHAONE
Separator : ;
Field : BETATWO
Separator : .
Field : CHARLIETHREE
Separator : !
我的表达没有像我想要的那样得到早期的字段ALPHAONE
和(以及它们的andBETATWO
的分隔符)。它只捕获了最后一个字段 ( )。;
.
CHARLIETHREE
我怎样才能得到所有匹配的部分singleFieldPattern
?
出于提问的目的,我已经简化了上面的数据格式,但是由于有些人想要真实数据,所以这里更接近实际数据:
(注意:[ ]中的值是不可打印的单字节,空格仅是为了清楚起见。)
例子:
[SYN] % SYSNAMScanner[ACK]; BAUDRATE57600[ACK]; CTRLMODEXON[ACK];
翻译:
系统名称 (SYSNAM) 是“扫描仪”
波特率是 57,600
流量控制是 XON