Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式与cpu挂钩_C#_.net_Regex - Fatal编程技术网

C# 正则表达式与cpu挂钩

C# 正则表达式与cpu挂钩,c#,.net,regex,C#,.net,Regex,我有4个正则表达式,我得到了旋转,他们的工作非常好,但在一些应用程序,他们是钉出cpu。我知道他们是最漂亮的正则表达式,但我不确定有没有更好的方法。我能做些什么来优化这些正则表达式吗 public static Regex schemaOrg = new Regex(@"\s*itemtype\s*=\s*('|"")\s*http://schema.org/\s*", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOption

我有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/

一个可能的改进是:

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


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

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

  • 尾随的
    \s*
    (在
    schema.org/\s*
    词汇表.org/\s*
    中)不是必需的,请将其删除。我假设这是因为您也没有检查尾随报价
  • 。(dot)
    在regex中有一个特殊的含义,在
    schema.org
    data词汇表.org
    中像这样对它进行转义
  • 第一个
    \s*
    没有意义,因为它还会将您的模式与
    someitemtype
    匹配。将其替换为
    \s+
    或尝试使用单词边界
    \b
    作为模式的开头
  • 如果您对此有疑心,还可以用
    (?:“|”)
    替换Regex来阻止它捕获组
    (“|”)
编辑:您也可以尝试惰性匹配,看看是否有帮助。我可以想象一种情况,你的正则表达式会阻塞CPU。请尝试下面的示例正则表达式:

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

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

您是否缺少结尾处的结束语
(“|”)
。@dasblinkenlight:如果有任何问题,它应该是一个结束语
\1
@TimPietzcker当然应该(在回答中它会),但在一条评论中,询问OP是否忘记了尾随的引号
(“|”)
比反向引用更容易理解。很抱歉,反应太慢,我正在尝试下面的建议,我没有检查后面的引号,因为后面可能会有更多的内容,比如.org/LocalBusiness,我只关心到.orgYou说的
(点)就像一只在复杂正则表达式中的蚂蚁,当它成为URL正则表达式的一部分时,很容易被忽略。这仍然严重影响cpu。我错过了任何变化。在操作中。在发布结果之前,请尝试编辑并(请)实现这两种正则表达式模式。我希望这会有帮助。对不起!在以后的编辑中添加了
\s+?
。示例字符串花费时间也会有所帮助。@Adam:如果它是一个文本处理应用程序,为什么你认为文本处理不是应用程序中最昂贵的部分?