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

时间:2010-06-18 18:53:10

标签: regex asp-classic content-management-system nested-sets

说我要求

parent/child/child/page-name

在我的浏览器中。我想提取父,子以及页面名称。这是我目前正在使用的正则表达式。网址请求中有多少个孩子应该没有限制。目前,页面名称将始终位于末尾,永远不会被省略。

^([\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函数拆分/分隔符,但是我发现我嵌套了这么多拆分语句,它变得非常难以理解。

所有人说,我需要一种有效的方法来解析父,子,以及字符串中的页面名称。有人可以提供替代解决方案吗?

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

谢谢。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用:

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

然后访问使用Match.SubMatches创建的三个匹配组。有关详细信息,请参阅here

修改

实际上,假设您知道[\w-]是部件名称中使用的全部内容,您可以使用^([\w-]+)(.*)([\w-]+)$代替它,它也可以自行处理无子案例