0

我有 4 个正则表达式,它们运行良好,但在某些应用程序中,它们与 cpu 挂钩。我知道它们是最好看的正则表达式,但我不确定更好的方法。我可以做些什么来优化这些正则表达式吗?

public static Regex schemaOrg = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://schema.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static Regex dataVocabulary = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://data-vocabulary.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);

基本上在寻找:

itemtype="http://schema.org/"
itemtype="http://data-vocabulary.org/"

但是有任意数量的空格,因为这在 html 中仍然有效。

例如:

itemtype   ="http://schema.org/"
itemtype=   "http://schema.org/"
itemtype="   http://schema.org/   "

都是有效的。

更新:仍然包裹 cpu 坏。

\s+itemtype\s*=\s*(?:'|"")\s*http://schema\.org/
4

2 回答 2

2

到目前为止,我只能想到一些事情。

  • 尾随\s*(in schema.org/\s*and vocabulary.org/\s*) 不是必需的,请将其删除。我假设这是因为您也没有检查尾随报价。
  • . (dot)在正则表达式中有特殊含义,像这样\.schema.organd中转义它data-vocabulary.org
  • 第一个\s*没有意义,因为它也会将您的模式与someitemtype. 将其替换为\s+或尝试使用单词边界\b作为模式的开头。
  • 如果您对此有疑虑,您还可以('|"")通过将其替换为(?:'|"").

编辑:您也可以尝试延迟匹配,看看是否有帮助。我可以想象你的正则表达式会阻塞 CPU 的情况。试试下面的示例正则表达式:

\s+?itemtype\s*?=\s*?(?:'|"")\s*?http://schema\.org/

如果这没有帮助,请在此问题的上下文中发布代码和示例字符串。

于 2012-12-07T16:51:50.193 回答
0

一个可能的改进是:

在执行 regex.match 之前将所有“”替换为“”

那么你的正则表达式不需要所有这些 \s

于 2012-12-07T16:46:04.457 回答