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

时间:2017-03-29 10:41:01

标签: regex string

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

例如,如果正则表达式看起来像这样(一些随机的例子):

[A-Z]*\s+(4|5)+

输出应为

ABCDEFGHIJKLMNOPQRSTUVWXYZ45

(省略空白)

一个明显的解决方案是定义一组完整的允许字符,并使用find方法返回每个字符的相应子序列。这似乎是一个沉闷的解决方案。

有人能想到如何实现这个(可能是简单的)算法吗?

1 个答案:

答案 0 :(得分:0)

你可以做的一件事是:

  • 按子组分割正则表达式
  • 针对子组测试char面板

请参阅以下示例(尚不完美)

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);
}

哪个输出:

  

测试[A-Z]

     

测试      

测试(4 | 5)

     

- &GT; ABCDEFGHIJKLMNOPQRSTUVWXYZ

     

? ? ???????? 45℃; -