我正在用c#构建一个词法分析引擎。在大多数情况下,它已完成并且运行良好。我的词法分析器的一个特性是它允许任何用户输入自己的正则表达式。这允许引擎利用各种有趣和有趣的东西并输出标记化文件。
我遇到的一个问题是我希望用户拥有此标记化文件中包含的所有内容。 I.E他们正在寻找的零件以及他们没有找到的零件(Partial Highlighting就是一个很好的例子)。
基于我的词法分析器突出显示的方式,我发现最好的方法是否定用户提供的正则表达式。
因此,如果用户想要为每次出现的“T”字符串lex,则否定版本会找到除“T”之外的所有内容。
现在上面的内容很容易,但是如果用户提供了8种复杂性质的表达式,有没有办法将所有这些表达式放在一起并否定该批次?
答案 0 :(得分:1)
您可以使用(pattern1)|(pattern1)| ...将几个RegEx组合成1 要否定它,你只需检查!IsMatch
var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})");
实际上会返回2个令牌(注意我已经两次使用相同的名称..没关系) 还可以探索Regex.Split。例如:
var split = Regex.Split("aa bb cc dd", @"(?<token>aa bb)|(?:\s+)");
将单词作为标记返回,但“aa bb”除外,它作为一个标记返回,因为我用(?...)将其定义为。
您还可以使用“索引”和“长度”属性来计算正则表达式无法识别的中间部分:
var matches = Regex.Matches("aa bb cc dd", @"(?<token>a{2})|(?<token>d{2})");
for (int i = 0; i < matches.Count; i++)
{
var group = matches[i].Groups["token"];
Console.WriteLine("Token={0}, Index={1}, Length={2}", group.Value, group.Index, group.Length);
}