我正在用C#编写一个小的标记化器。
在PCRE Regex规范中,有一个整洁的MARK
关键字:
https://pcre.org/current/doc/html/pcre2syntax.html#SEC23
这是它的工作原理:
<?php
$string = 'bar';
$matches = [];
preg_match('~(?|foo(*:1)
|bar(*:2)
|baz(*:3))~x', $string, $matches);
var_dump($matches);
//> array(2) {
//> [0]=> string(3) "bar"
//> ["MARK"]=> string(1) "2"
//> }
如您所见,结果集中的MARK
参数允许您查看正则表达式的哪个分支实际匹配。不幸的是,.NETs Regex框架不支持MARK
关键字。这就是我现在正在做的事情:
var pattern = @"(
(?<foo>foo)
|(?<bar>bar)
|(?<baz>baz)
)";
var regexOptions = RegexOptions.ExplicitCapture | RegexOptions.IgnorePatternWhitespace;
var regex = new Regex(pattern, regexOptions);
var matches = regex.Matches("bar");
foreach (Match match in matches)
{
int? mark = null;
if (match.Groups["foo"].Success)
{
mark = 1;
}
else if (match.Groups["bar"].Success)
{
mark = 2;
}
else if (match.Groups["baz"].Success)
{
mark = 3;
}
}
基本上,我需要重建整个正则表达式,以查看实际匹配的捕获组。
这似乎倒退了。有没有更好的方法可以做同样的事情?
我需要这个的原因是因为在tokenizer中我不仅需要知道语法是否有效,还需要知道匹配的令牌实际上是哪种令牌类型。
答案 0 :(得分:1)
如果您坚持使用 void setup()
{
pinMode(3, OUTPUT);
}
void loop()
{
for (int i=100; i <= 25500; i+100){
digitalWrite(3, HIGH);
delayMicroseconds(i);
digitalWrite(3, LOW);
delayMicroseconds(i);
}
}
信息或想要通常使用.NET中的PCRE正则表达式,请查看PCRE.NET,这是一个.NET包装器(可通过NuGet获得) PCRE库。它提供了很多用于.NET的PCRE功能,包括Mark检索。
这是一个简短的例子:
MARK