Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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++ 如何从正则表达式模式列表中找到最具体的匹配项?_C++_Regex - Fatal编程技术网

C++ 如何从正则表达式模式列表中找到最具体的匹配项?

C++ 如何从正则表达式模式列表中找到最具体的匹配项?,c++,regex,C++,Regex,我有一系列正则表达式模式,并且正在将传入的HttpRequest路径与这些模式匹配。我希望遍历它们并找到最具体的匹配项(URI可能匹配多个正则表达式模式) 例如,“/static/images/foo.jpg”将匹配以下三种正则表达式模式: ^/ ^/static/images/ ^/static/ ^/echo/$ 如何遍历列表,并确定最具体的匹配是^/static/images/ 为了简单起见,我们假设这里的“最具体”是指从左到右匹配的大多数字符或子模式。我意识到,如果我们引入类似以下正

我有一系列正则表达式模式,并且正在将传入的HttpRequest路径与这些模式匹配。我希望遍历它们并找到最具体的匹配项(URI可能匹配多个正则表达式模式)

例如,
“/static/images/foo.jpg”
将匹配以下三种正则表达式模式:

^/
^/static/images/
^/static/
^/echo/$
如何遍历列表,并确定最具体的匹配是
^/static/images/


为了简单起见,我们假设这里的“最具体”是指从左到右匹配的大多数字符或子模式。我意识到,如果我们引入类似以下正则表达式的内容,“最具体”就会变得模棱两可:

.*\.(jpg|png)$

正如在评论中提到的,除了手动之外,没有确定的方法来解决问题。但是,您可以做一些事情来提出一个半启发式算法,理论上至少可以在您的特定情况下帮助您:

  • 您可以测试图案的长度。在这个例子中,longest=most-specific,虽然情况并非总是如此,但它至少可以给出一个想法
  • 您可以重新测试这些模式。例如-
    ^/static/
    适合于
    ^/static/images/
    ,因此
    ^/static/images/
    更具体
  • 您可以跟踪已经匹配特定模式的URI数量。与模式匹配的URI越少,它就越具体

  • 你可以使用交替

    您可以从左向右缩放特定性

    1-最具体的
    4-最不特定

    (^/static/images/|^/static/|^/|^/echo/$)
             1            2      3     4
    

    如果它与1匹配,那么它就不会为2、3和4而烦恼。

    因为标准有点难以指定,为什么不将它们(在代码中)按最不特定的顺序排列呢。循环所有模式,跟踪最后一个(因此也是最具体的)匹配模式。你有退化的情况,可以应用“最长正则表达式”的标准,所以就照@Paul的建议去做吧。@PaulRoub是的,我同意。但是,我从用户可编辑的配置文件中获取这些模式。最糟糕的情况是,我本打算指定它们被订购,但正在寻找一种方法来确保这一点。我如何知道它与哪个匹配?这个解决方案仍然需要通过特殊性进行排序。问题是如何根据我所了解的情况来决定在运行时哪个模式最具体。