是否存在将正则表达式组合在一起的通用方法?
在编写其中一个Euler问题的解决方案时,我的代码最终表现如下:
List<String> expressions; //There are 50 regex expr in this list
List<Regex> regexes = new List<Regex>();
foreach (String expr in expressions)
{
regexes.add(new Regex(expr, RegexOptions.Compiled));
}
foreach (String line in File.ReadAllLines(...))
{
bool matches = true;
foreach (Regex regex in regexes)
{
if (!regex.isMatch(line))
{
matches = false;
break;
}
}
if (matches)
{
Console.WriteLine("This line matches all of the regexes: ");
Console.WriteLine(line);
break;
}
}
上述方法效率不高,因为它会扫描文件中的每一行50次。
我想创建一个匹配一行的正则表达式,只有当所有50个正则表达式都匹配该字符串时。这样每行只扫描一次(由于限制性更强的正则表达式,希望不匹配的行会提前失败)。
(我不在乎他们匹配的地方,我只需要知道他们是否匹配)。
从我的一些CS课程中,我似乎记得通过为每个正则表达式生成DFA然后将它们相交来学习如何手动完成。
那么,C#是否有内置的方法将任意正则表达式与AND组合?
如果没有,如何通过基于ANDing两个正则表创建一个新的正则表达式来实现相同的结果? (更好的是Regex的扩展方法)。
答案 0 :(得分:0)
好吧,正如我对.NET中正则表达式的理解。对于两个正则表达式,你可能没有解决方案。但是,我想出了:
Lookup<TKey, TElement> data structure。这里的键是你的正则表列表的集合,而元素是你的字符串集合。我认为搜索会比你的搜索效率更高。
你想出了自己的状态机。 How regex converted to state machine