正则表达式 - 标记以查看匹配的捕获组

时间:2018-03-13 12:51:50

标签: c# .net regex pcre

我正在用C#编写一个小的标记化器。

在PCRE Regex规范中,有一个整洁的MARK关键字:
https://pcre.org/current/doc/html/pcre2syntax.html#SEC23

这是它的工作原理:

https://3v4l.org/ErCrp

<?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中我不仅需要知道语法是否有效,还需要知道匹配的令牌实际上是哪种令牌类型。

1 个答案:

答案 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