C++ 如何从正则表达式模式列表中找到最具体的匹配项?
我有一系列正则表达式模式,并且正在将传入的HttpRequest路径与这些模式匹配。我希望遍历它们并找到最具体的匹配项(URI可能匹配多个正则表达式模式) 例如,C++ 如何从正则表达式模式列表中找到最具体的匹配项?,c++,regex,C++,Regex,我有一系列正则表达式模式,并且正在将传入的HttpRequest路径与这些模式匹配。我希望遍历它们并找到最具体的匹配项(URI可能匹配多个正则表达式模式) 例如,“/static/images/foo.jpg”将匹配以下三种正则表达式模式: ^/ ^/static/images/ ^/static/ ^/echo/$ 如何遍历列表,并确定最具体的匹配是^/static/images/ 为了简单起见,我们假设这里的“最具体”是指从左到右匹配的大多数字符或子模式。我意识到,如果我们引入类似以下正
“/static/images/foo.jpg”
将匹配以下三种正则表达式模式:
^/
^/static/images/
^/static/
^/echo/$
如何遍历列表,并确定最具体的匹配是^/static/images/
为了简单起见,我们假设这里的“最具体”是指从左到右匹配的大多数字符或子模式。我意识到,如果我们引入类似以下正则表达式的内容,“最具体”就会变得模棱两可:
.*\.(jpg|png)$
正如在评论中提到的,除了手动之外,没有确定的方法来解决问题。但是,您可以做一些事情来提出一个半启发式算法,理论上至少可以在您的特定情况下帮助您:
^/static/
适合于^/static/images/
,因此^/static/images/
更具体你可以使用交替 您可以从左向右缩放特定性 1-最具体的
4-最不特定
(^/static/images/|^/static/|^/|^/echo/$)
1 2 3 4
如果它与1匹配,那么它就不会为2、3和4而烦恼。因为标准有点难以指定,为什么不将它们(在代码中)按最不特定的顺序排列呢。循环所有模式,跟踪最后一个(因此也是最具体的)匹配模式。你有退化的情况,可以应用“最长正则表达式”的标准,所以就照@Paul的建议去做吧。@PaulRoub是的,我同意。但是,我从用户可编辑的配置文件中获取这些模式。最糟糕的情况是,我本打算指定它们被订购,但正在寻找一种方法来确保这一点。我如何知道它与哪个匹配?这个解决方案仍然需要通过特殊性进行排序。问题是如何根据我所了解的情况来决定在运行时哪个模式最具体。