【问题标题】:Is it possible to get the specific part of a regex that matched the string是否有可能获得与字符串匹配的正则表达式的特定部分
【发布时间】:2022-12-19 19:38:05
【问题描述】:

我有一个正则表达式,有很多部分。 例子:

var match = Regex.match("可变字符串","(变量|变量|字符串变量|strink|变量字符串|varstrings)");

我的真实例子有很多,有很多细微的差别。

我需要一种方法来知道我的正则表达式的哪一部分受到了影响。 就像在这种情况下 = "(variable|variables|string variable|string|可变字符串|可变字符串)” 我希望正则表达式或代码的差异部分告诉我 |variablestring|是受到打击的正则表达式的一部分。 我不太关心输出本身,我想知道 REGEX 的哪一部分是我得到匹配的原因 有办法吗?

我研究了不同的方法,并寻找了一些方法或属性,但我还没有找到任何可以帮助我的具体方法,有人有什么想法吗?

【问题讨论】:

  • 这个问题已经在这个网站上被问过很多次,但基本上你想做的是把较长的术语放在交替的第一位,即使用:(variablestring|variables|variable|stringvariable|string|varstrings)
  • 不,那不是我想要的,我想要得到在我的字符串上命中的特定正则表达式部分
  • edit您的帖子提供一个具体示例,包括输入、模式和预期输出。包括您的尝试也会有所帮助。
  • 'one' -match '(?:(?<matched_one>one)|(?<matched_two>two))'
  • 有意思,这是什么?

标签: c# regex


【解决方案1】:

下面的代码应该可以解决问题。

void Main()
{
    // note: the names can differ from the matched value; I kept them the same so it's obvious which value they relate to
    var pattern = "(?<variable>variabe)|(?<variables>variables)|(?<stringvariable>stringvariable)|(?<strink>strink)|(?<variablestring>variablestring)|(?<varstrings>varstrings)";

    var stringToTest = "variablestring";
    var match = Regex.Match(stringToTest,pattern);

    var nameOfMatchGroup = 
        match
        .Groups
        .Cast<Group>()
        .Where(x => x.Success && (x.Name != "0"))
        .First()
        .Name;

    Console.WriteLine(nameOfMatchGroup);
}

正则表达式模式是 "(?&lt;variable&gt;variabe)|(?&lt;variables&gt;variables)|(?&lt;stringvariable&gt;stringvariable)|(?&lt;strink&gt;strink)|(?&lt;variablestring&gt;variablestring)|(?&lt;varstrings&gt;varstrings)

这使用了名为 Named Capture groups 的东西:(?&lt;name&gt;pattern),其中 name 是组的名称,pattern 是该组内容的正则表达式模式。更多请看MS Documentation

然后我使用 Linq 过滤组中的各种捕获以找到匹配的 (Success = true),忽略带有 Name = 0 的那个,因为这是整个表达式,而不是名为捕获组的子项。 然后我取第一个匹配这些条件的项目(在这种情况下只有一个,就好像多个模式匹配它们由竖线分隔;所以一旦一个匹配该集合中的其他可能匹配项将被忽略,因为那部分该字符串已经过测试),然后获取该捕获组的Name

Cast语句是因为GroupCollectionmatch的类型)没有实现IEnumerable;所以要在它上面使用 Linq,我们首先需要转换它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多