用于替换字符串中元素的合适正则表达式

时间:2013-05-23 00:51:08

标签: regex

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

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

最初我正在考虑让函数解析整个字符串,当遇到字符*#时,它会检查下一个字符,如果它是{{1 }},它会一直持续到遇到非:字符,此时它会占用该短语,将其括在a-z?<中,然后是之前的合适模式发现,最后把整个东西放在括号内,然后继续,但实际上,这不是最有效的方法,当我尝试定义超过50个规则时,处理时间大约需要50ms,当你考虑时这仍然是引导过程的一部分,似乎太长了,特别是当一个复杂的webapp可能有超过200个url规则时。

我已经看过正则表达式替换函数了,但是目前,它有点过头了...我不确定这是否是最好的解决方案,如果是一个解决方案的话。那么,有没有人知道如何实现它,或者有更好的解决方案可以及时完成我的尝试?

其他

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

>

会匹配网址

/*:init-test/#/*

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

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

会匹配网址

/*:init:test/#/*

1 个答案:

答案 0 :(得分:1)

我会说正则表达式正则表达式。首先你需要逃避任何特殊的东西,应该很容易(而且语法很烦人)所以我会跳过这一点。

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

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

然后是未命名的东西

\* ----> .+
\# ----> \d+