代码之家  ›  专栏  ›  技术社区  ›  Mike

匹配组中除第一次和最后一次出现以外的所有字符

  •  1
  • Mike  · 技术社区  · 16 年前

    说我请求

    parent/child/child/page-name
    

    在我的浏览器中。我要提取父级、子级和页名。以下是我当前使用的正则表达式。对于URL请求中有多少子级应该没有限制。目前,页面名称将始终位于末尾,并且永远不会被省略。

    ^([\w-]{1,}){1} -> Match parent (returns 'parent')
    (/(?:(?!/).)*[a-z]){1,}/ -> Match children (returns /child/child/)
    [\w-]{1,}(?!.*[\w-]{1,}) -> Match page name (returns 'page-name')
    

    我玩得越多,我就越觉得这个解决方案有多笨拙。这是我在ASP Classic(:())中开发的一个小CMS。它有点像MVC路由路径。但不是根据URL请求调用控制器和函数。我将沿着层次结构向下移动,并在数据库中找到适当的页面。该数据库正在使用嵌套集模型,并通过每个子数据库的唯一页面名称进行链接。

    我尝试使用split函数用/分隔符进行拆分,但是我发现我在一起嵌套了太多的split语句,因此无法读取。

    总之,我需要一种有效的方法来从字符串中解析出父级、子级以及页名。有人能提供另一种解决方案吗?

    老实说,我甚至不确定正则表达式是否是解决我问题的最佳方案。

    谢谢您。

    1 回复  |  直到 16 年前
        1
  •  2
  •   VeeArr    16 年前

    您可以尝试使用:

    ^([\w-]+)(/.*/)([\w-]+)$
    

    然后访问使用创建的三个匹配组 Match.SubMatches . 见 here 了解更多详细信息。

    编辑

    实际上,假设你知道 [\w-] 是所有零件名称中使用的,您可以使用 ^([\w-]+)(.*)([\w-]+)$ 相反,它也会自己处理无子案件。

    推荐文章