什么是 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 兼容吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux下如果把pcre库卸载了,会出现啥后果

怎么检查 linux是不是安装 pcre

PHP 正则小解

2017年8月20日第四篇

ningx配置ModSecurity重启出现兼容性问题:ModSecurity: Loaded PCRE do not match with compiled!的解决方法

Nginx安装