.net - 如何优化此正则表达式以获得更好的性能?
问题描述
我正在尝试优化我的 .NET 应用程序的正则表达式之一。
正则表达式:(?<!WordA\s(?:WordB\s)?)(WordB\s)?WordC
逻辑:
- 查找匹配的 WordC
- 加入 WordB 以匹配(如果出现在 WordC 之前)
- 如果 WordC(即使在 WordB 之前)在 WordA 之前,则不匹配任何内容
应该匹配:
- 文字
- WordB WordC
不应该匹配:
- WordA WordC
- WordA WordB WordC
该表达式有效,但正如您所见,WordB 在表达式中出现了两次,因此我试图删除其中一个以获得更好的性能。
注意:“单词”实际上是复杂的表达方式。
有什么办法吗?
解决方案
“优化”(?<!WordA\s(?:WordB\s)?)(WordB\s)?WordC
正则表达式(即(?<!WordA\s)WordC
and的组合(?<!WordA\s)WordB\sWordC
)的问题在于WordB
andWordC
用空格分隔,并且否定的后视不会使正则表达式引擎跳过匹配的短语,一旦WordB WordC
前面有 with WordA
,它只会跳过位置它失败了,所以WordC
如果你只使用(?<!WordA\s)(WordB\s)?WordC
. 后视必须限制两者WordB\sWordC
,WordC
这就是为什么您必须在后视模式中重复可选WordB
的原因,就像在上面显示的两个“解构”模式中使用它一样。
因此,使用纯字符串正则表达式,没有其他方法。
涉及一些代码更改的解决方法可能看起来像
var rx = @"(WordA\s)?(?:WordB\s)?WordC";
var strings = new List<String> {"WordC", "WordB WordC", "WordA WordC", "WordA WordB WordC"};
foreach (var s in strings)
{
var m = Regex.Match(s, rx);
Console.WriteLine("{0}: {1}", s, (m.Groups[1].Success ? "NO MATCH" : m.Value));
}
// => WordC: WordC
// => WordB WordC: WordB WordC
// => WordA WordC: NO MATCH
// => WordA WordB WordC: NO MATCH
请参阅C# 演示。
在(WordA\s)?(?:WordB\s)?WordC
正则表达式中,带有空格的捕获被捕获到第 1 组,如果匹配,我们知道我们需要丢弃匹配项(WordA\s)?
。WordA
如果 Group 1 的.Success
值为false,则表示匹配有效。
推荐阅读
- android - 颤振库比蒂诺图标不显示
- docker - 无法启动 Kafka-Minion 容器
- django - Django save() 方法保存 3 个字段中的 2 个。第三个没有发现错误但不会保存
- android - 可以在 Unity 中使用 Swift 代码并将其导出到 Android 和 iOS
- android - 如何根据 ViewPager2/TabView 中的 Fragment 更改 android 活动的标题
- intel - 让 perf 在较新的处理器上正确使用某些性能计数器
- python - 使用 Python 在 json 字符串中查找信息
- c++ - C ++ / C项目中的Getter和Setter?
- c++ - Swift memcpy 与 ZMQ zmq_msg_data 一起使用时没有任何效果
- sql - 排除重叠时间段