什么是 PCRE 兼容语法? C# PCRE 兼容吗?
Posted
技术标签:
【中文标题】什么是 PCRE 兼容语法? C# PCRE 兼容吗?【英文标题】:What is PCRE-compatible syntax? And is C# PCRE-compatible? 【发布时间】:2014-12-17 17:09:09 【问题描述】:从***我发现了这个:
Perl 兼容正则表达式 (PCRE) 是一个正则表达式 C 受 Perl 中正则表达式功能启发的库 编程语言,由 Philip Hazel 编写,从夏天开始 1997. PCRE 的语法比任何 POSIX 正则表达式风格和许多经典正则都更强大和灵活 表达式库。这个名字有误导性,因为 PCRE 和 Perl 每个人都有彼此不共享的能力。
Source
【问题讨论】:
您希望 C#(它不是正则表达式语法)如何与 PCRE 兼容?您的意思是“.NET 的Regex
类使用的正则表达式语法是否与 PCRE 兼容?”也许?
@JonSkeet 是的,你是对的。到目前为止,我对 PCRE 没有任何想法。
我是因为Regex101
中的这个问题才来这个问题的:github.com/firasdib/Regex101/issues/124
【参考方案1】:
C# 正则表达式与 PCRE 正则表达式共享一些语法。大多数功能重叠,但两个库都有自己的细节:
几个例子:
PCRE
支持递归 支持回溯控制动词 支持(?(DEFINE) ... )
等结构
支持更多选项
提供 DFA 解析模式
支持部分匹配
支持\K
支持X++
简写语法(相当于(?>X+)
)
.NET
支持捕获堆栈和重复命名组 支持平衡组 支持可变长度后视此列表并不详尽。您可以在 this page 和兄弟页面上比较这两种风格。
考虑到这些差异,我希望能够使用来自 .NET 的 PCRE 正则表达式,并且最近启动了 PCRE.NET,这是一个包装器项目。它还没有完成,但已经开始可用了。
【讨论】:
作为 .NET 的旧 PCRE 包装器的长期用户,我很高兴找到您一直在研究的那个(与旧的不兼容的 4.5.2 兼容)并且加倍很高兴发现它同样快,3 年前我正在做很多正则表达式处理并切换到 PCRE,当我意识到本机 C# 正则表达式处理速度非常慢时。最近的例子 - 100 个文件,通过大约 90 个正则表达式规则,C# - 190s,PCRE - 4s...... @Simon 很好,感谢您的反馈! :) 虽然它在很大程度上取决于所涉及的正则表达式,但我还没有花足够的时间进行基准测试,但是在 .NET 中某些模式肯定更快。 我的主要是零宽度前瞻类型,即 (?=.*?words)(?=.*?order)(?=.*?in)(?=.*?any)。我现在遇到的问题(有点!)我正在处理内存中已经存在的 3K 文档,而旧 C# 的 CPU 为 100%,但使用 PCRE 它不会超过 25%,没有其他活动磁盘等,我我在针对 90 个正则表达式的并行 foreach 中运行 3K,即使添加大量调试输出也只会将 CPU 推到 45%!假设我已经达到了一些不易监控的物理 CPU 读取 RAM 限制,假设 PCRE 中没有线程限制? @Simon nope,PCRE 和 PCRE.NET 是完全线程安全的。看起来是时候在代码上使用分析器了,这是了解瓶颈来自何处的唯一方法。尽管在您的情况下,我认为您最好完全避免使用正则表达式并使用String.Contains
,或者您应该考虑使用类似 Lucene.NET 的东西。另外,我希望这个正则表达式以^
开头:)
感谢您确认线程。 Profiler 是我的下一个任务,我不使用 ^ 像往常一样使用 Match 运行这些,假设(天真?)涵盖了开始锚定。一位同事提到 String.Contains 但鉴于这些正则表达式很少注册两位数 ElapsedTicks 将 4 String.Contains 与说之前的正则表达式真的更快还是短路有帮助,尽管我想知道如果第一个正则表达式会做同样的事情找不到单词。以上是关于什么是 PCRE 兼容语法? C# PCRE 兼容吗?的主要内容,如果未能解决你的问题,请参考以下文章
ningx配置ModSecurity重启出现兼容性问题:ModSecurity: Loaded PCRE do not match with compiled!的解决方法