我有一个C#Regex类,可以匹配多个子组,例如
(?<g1>abc)|(?<g2>def)|(?<g3>ghi)
但是有更复杂的子模式。除了现有的组之外,我基本上想要匹配任何不属于这些组的东西。
我试过
(?<g1>abc)|(?<g2>def)|(?<g3>ghi)|(.+?)
但结果太慢了。我不能否定,因为我不想冗余地复制那些复杂的子模式。使用just(。+)会按预期覆盖所有其他组。
还有其他方法吗?如果这不起作用,我将不得不编写一个特殊的解析器。
其他详细信息:所有这些组都是根据MatchEvaluator进行评估的。因此,将“不匹配的字符串”发送到MatchEvaluator的Regex类行为也将起作用。
示例文本为
.......abc........ghi.....def.....abc....def...ghi......abc.......
我想在中间抓住部分。
答案 0 :(得分:2)
但结果太慢了。我做不到 否定因为我不想复制 那些复杂的子模式是多余的。
为什么不能这样:
const string COMPLEX_REGEX_PATTERN = "\Gobbel[dy]go0\k"
答案 1 :(得分:2)
你的正则表达式为g1,g2,g3之外的每个字符生成单独的匹配。因此,当您将其与MatchEvaluator一起使用时,它会生成许多评估程序调用。这就是它缓慢的原因。
如果您尝试使用正则表达式:
(?<rest>.*?)((?<g1>abc)|(?<g2>def)|(?<g3>ghi)|$)
对于不包含“g”组的整个文本片段,您将获得单个“休息”组匹配。
Regex C#代码:
Regex regex = new Regex(
@"(?<rest>.*?)((?<g1>abc)|(?<g2>def)|(?<g3>ghi)|$)",
RegexOptions.Singleline
| RegexOptions.Compiled
);
答案 2 :(得分:1)
您是否尝试过设置要编译的正则表达式选项?我发现使用静态编译的正则表达式可以大大加快速度。
答案 3 :(得分:0)
如果你的正则表达式长达四页,那么自己写一个状态机可能是个更好的主意......