1

我正在构建一个路由器库,用于将简单定义的模式转换为正则表达式,以后可用于比较 url。这样就可以简单地定义规则,而库将负责其余的工作。

让我们假设字符串/*/#:id/#被传递到库中,我想得到/^\/(.{1}.*)\/(?<id>[0-9]{1}[0-9]*)\/([0-9]{1}[0-9]*)$/i. 最初,该库旨在处理仅转换*#匹配任何文本 ( (.{1}.*)) 和([0-9]{1}[0-9]+)分别匹配数字 (),但现在我想包含命名特定匹配项的选项。做一个简单的字符串替换是行不通的。

最初我正在考虑让一个函数解析整个字符串,当遇到字符*or#时,它将检查下一个字符,如果是 a :,它将继续直到a-z遇到非字符,此时它将取那个短语,将其括在?<and>中,然后是先前找到的合适模式,最后将整个内容括在括号中,然后继续,但实际上,这不是最有效的方法,当我尝试定义时超过 50 条规则,处理时间大约需要 50 毫秒,当您认为这仍然是引导过程的一部分时,它似乎太长了,特别是当复杂的 web 应用程序可能有超过 200 条 url 规则时。

我已经看过正则表达式替换函数,但目前,它有点超出我的头脑......我不确定这是否是最好的解决方案,如果是一个解决方案。那么,有谁知道它是如何实现的,或者有一个更好的解决方案可以及时执行我正在尝试的事情?

额外的

我还应该注意,我包含的一些规则可能如下所示:

/*:init-test/#/*

这将匹配 url 之类的

/foo-test/123/asdf
/bar-test/456/jkl

我计划的另一条规则可能如下所示:

/*:init:test/#/*

这将匹配 url 之类的

/footest/123/asdf
/bartest/456/jkl
4

1 回答 1

1

我会说正则表达式你的正则表达式。首先,您需要转义任何特殊的东西,应该足够简单(而且语法很烦人),所以我将跳过那一点。

接下来,您将要替换您的特殊情况,首先是任何命名的东西。

\*(:[A-Za-z]+:?)? ---> (?<\2>.+)
\#(:[A-Za-z]+:?)? ---> (?<\2>\d+)

然后是无名的东西

\* ----> .+
\# ----> \d+
于 2013-05-23T01:34:05.137 回答