2012-01-18 52 views
0

我想简化这个表达式。有没有更好的方式来使用查找或其他?当谈到正则表达式时,我很低级。参数3美元,5美元和7美元的参数是可选的。 $ 1是必需的。如何接受RegEx表达式中的可选参数?

^ 
/application/ 
([0-9a-zA-Z_]+) 
([\/]([0-9a-zA-Z_]+))? 
([/\?|\?|\/]([^\?]*))? 
([\?](.*))? 
$ 

service => $1 
target => $3 
args => $5 
filter => $7 

/application/blender/banana?add = milk。

btw使用RegExr构建和测试表达式,如果您还没有听说过它,它是一个很棒的工具。

回答

1

此:

([\/]([0-9a-zA-Z_]+))? 

可以被简化为:

(\/[0-9a-zA-Z_]+)? 

和:

([\?](.*))? 

可以被简化为:

(\?.*)? 

,因为+*(还有?)仅适用于上述项目。

我不知道这是什么:

[/\?|\?|\/] 

应该是。也许你的意思是:

(?:/\?|\?|\/) 

即无论是/??/。 (该(?:...)是一个非捕获组)。

这给:

^ 
/application/ 
([0-9a-zA-Z_]+) 
(\/[0-9a-zA-Z_]+)? 
((?:/\?|\?|\/)[^?]*)? 
(\?.*)? 
$ 

service => $1 
target => $2 
args => $3 
filter => $4 
+0

活泉!多数民众赞成真棒=],是的,我的意思是非capt。有时候第三方会附加自己的问题?到我们的查询字符串,所以我需要一种方法来检测最后一个过滤器并将其视为一组参数。另外我不想在输出值中使用任何斜线,你的$ 2就是这样,是吗? – qodeninja 2012-01-18 20:08:49

+0

是的。如果你不想在第二个捕获组中使用斜杠,你可以这样做:'(?:\ /([0-9a-zA-Z _] +))?'。或者,您可以在事件发生后从拍摄的文本中删除斜杠。 – MRAB 2012-01-18 23:19:27

+0

这基本上是我以前有过!大声笑 – qodeninja 2012-01-19 22:34:45

相关问题