Regex 从正则表达式中提取所有允许的字符

Regex 从正则表达式中提取所有允许的字符,regex,string,c#,Regex,String,C#,我需要从给定的正则表达式中提取所有允许字符的列表 例如,如果正则表达式如下所示(一些随机示例): 输出应该是 ABCDEFGHIJKLMNOPQRSTUVWXYZ45 (省略空格) 一个显而易见的解决方案是定义一组完整的允许字符,并使用find方法为每个字符返回相应的子序列。不过,这似乎是一个有点乏味的解决方案 有人能想出一个(可能是简单的)算法来实现这一点吗?您可以做的一件事是: 按子组拆分正则表达式 针对子组测试char面板 请参见以下示例(尚未完善): static void Mai

我需要从给定的正则表达式中提取所有允许字符的列表

例如,如果正则表达式如下所示(一些随机示例):

输出应该是

ABCDEFGHIJKLMNOPQRSTUVWXYZ45
(省略空格)

一个显而易见的解决方案是定义一组完整的允许字符,并使用
find
方法为每个字符返回相应的子序列。不过,这似乎是一个有点乏味的解决方案


有人能想出一个(可能是简单的)算法来实现这一点吗?

您可以做的一件事是:

  • 按子组拆分正则表达式
  • 针对子组测试char面板
请参见以下示例(尚未完善):

static void Main(字符串[]args)
{

Console.WriteLine($“-->{TestRegex(@“[A-Z]*\s+(4 | 5)+”)是否需要代码(使用哪种语言?)或者只是一个想法?你已经想好了吗?我其实只是在寻找一个想法。它所使用的语言并不是那么重要。所以基本上你是在要求一个被称为正则表达式解释器的算法…我认为你不会得到任何正确的答案…你真正需要做的是非常了解正则表达式(如果你不知道的话)并相应地实现您的解释程序。算法是,从正则表达式的左边开始读取,一直读取到正则表达式的末尾,在这样做的同时解释当前和之前以及之后的字符在这里不是一个简单的解决方案…您的任务将接近创建正则表达式引擎…除非您找到任何开源引擎(你可以用谷歌搜索一下)我偶然发现的一个Java库能够执行这项任务。但是,由于它不是问题的答案,我将把它作为一个注释发布,因为它可能会帮助别人:有了它,你可以做
Automaton Automaton=new RegExp(regex).toAutomaton();
,然后使用
set strings=automaton.singleChars().getFiniteStrings();
检索一组字符,这也是我最初想到的。但是为了覆盖整个正则表达式语法(即ECMAScript正则表达式语法),它必须进行大量的改进.它也相当慢,因为测试所有字符都需要相当长的时间consuming@super-因为这是一种蛮力方法,根据定义,它会很慢。它的优点是不需要编写正则表达式解析器…是的,这是正确的,当然,我不是说这个答案不正确。但这或多或少是我在t中提到的方法他已经问过了
ABCDEFGHIJKLMNOPQRSTUVWXYZ45
static void Main(String[] args)
{
    Console.WriteLine($"-->{TestRegex(@"[A-Z]*\s+(4|5)+")}<--");
}

public static string TestRegex(string pattern)
{
    string result = "";
    foreach (var subPattern in Regex.Split(pattern, @"[*+]"))
    {
        if(string.IsNullOrWhiteSpace(subPattern))
            continue;
        result += GetAllCharCoveredByRegex(subPattern);
    }
    
    return result;
}

public static string GetAllCharCoveredByRegex(string pattern)
{
    Console.WriteLine($"Testing {pattern}");
    var regex = new Regex(pattern);
    var matches = new List<char>();
    for (var c = char.MinValue; c < char.MaxValue; c++)
    {

        if (regex.IsMatch(c.ToString()))
        {
            matches.Add(c);
        }
    }
    return string.Join("", matches);
}