我想解析一些具有
形式的文本(<paramID><paramValue>)*(LastValue)*
其中paramID是参数的ID,paramValue几乎是任何不包含潜在paramID的东西(所以我们可以毫不含糊地解析它)。
需要注意的主要事项是:
paramID = "\s-[^\s\[\(\{\\""]+"
paramValue =基本上是paramID之间的内容。由于这可能包含类似于paramID的内容,但由于它们位于&#34;组&#34;内,因此需要忽略它们。
如,
First Param Value -p1 Second Param Value -p2[Third-Param-Value] -X "-Fourth -Param -Value" -pl LastParamValue Last Value
应该以明显的方式解析。
答案 0 :(得分:1)
我建议将表达式标记为如下:
void tmrRepeatedScan_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
lock (thisLock)
{
var detectedTags = serialPort.Scan(true, false, true, false);
foreach (var tag in detectedTags)
{
bool tagFound = false;
string TID = Regex.Replace(Conversions.ByteToHexadecimal(tag.GetTagId()), "(.{2})(?!$)", "$0-");
string EPC = Regex.Replace(Conversions.ByteToHexadecimal(tag.GetEpc()), "(.{2})(?!$)", "$0-");
foreach (DataGridViewRow row in dgvTags.Rows)
{
if (row.Cells[0].Value.ToString().Equals(TID))
{
row.DefaultCellStyle.BackColor = Color.LightGreen;
tagFound = true;
break;
}
}
bool isNewTag = !tagsReaded.Contains(TID);
if (!tagFound && isNewTag )
{
dgvTags.BeginInvoke(new InvokeDelegate(() => AddRow(TID, EPC)));
}
if (newTag)
{
tagsReaded.Add(TID);
}
}
}
foreach (DataGridViewRow row in dgvTags.Rows)
{
if (!tagsReaded.Contains(row.Cells[0].Value.ToString()))
{
row.DefaultCellStyle.BackColor = Color.White;
}
}
}
catch (Exception ex)
{
foreach (DataGridViewRow row in dgvTags.Rows)
{
row.DefaultCellStyle.BackColor = Color.White;
}
}
}
可能会(?>(?'o'\[)[^][]*)+(?>[^][]*(?'-o'\]))+
。这允许组嵌套。[...]
和{...}
群组生成类似的表达所以tokenizer表达式是:
(...)
然后我们需要扫描标记并适当地收集参数值对:
(?x)
\s*(?<token> (?>(?'o'\[)[^][]*)+(?>[^][]*(?'-o'\]))+ )\s* # balanced [...] group
| \s*(?<token> (?>(?'o'\{)[^{}]*)+(?>[^{}]*(?'-o'\}))+ )\s* # balanced {...} group
| \s*(?<token> (?>(?'o'\()[^()]*)+(?>[^()]*(?'-o'\)))+ )\s* # balanced (...) group
| \s*(?<token> "(?:\\"|[^"])*" )\s* # quoted group with possible escaped quotes within
| \s*(?<token> -[^\s"({[]+ ) # parameter name
| (?<token> \s*\S+\s* ) # parameter value part not in group/quotes