2010-06-03 49 views
3

我有以下两个regular expressions(顺序btw)。是否有可能将这两个正则表达式合并为一个?

1. ^~/buying/(.*)\?(.*) => foo= group 1 baa= group 2. 
2. ^~/buying/(.*)   => foo= group 1 baa= nothing/empty/null/baibai 

我想要做的是,如果网址有问号,然后将其分成两组。否则,只需将所有内容放入第一组。

订单对我来说很重要的原因是,如果我将它们切换为“?”正则表达式永远不会被解雇,因为#2表达式(上面)会捕获所有。

那么..这可以重新固定吗?

注:我试过using this website **来帮助我调试/调整..但我无法弄清楚。

**我与该网站没有任何关系。

+0

这是Perl的?我建议你这样标记它。 – 2010-06-03 06:41:00

回答

5

试试这个:

^~/buying/([^?]*)\??(.*) 

([^?]*) - 捕获的第一组,其中不包含问号。
\?? - 可选问号。
(.*) - 可选的第二组 - 可以为空。

1

如何只使第二部分可选的(未经测试):

^~/buying/([^\?]*)(?:\?(.*))? 

?:,以防止有可选的部分(您需要的部分加上问号)从捕获。

编辑:由于贪婪,您需要使用否定字符类[^ \?]或使其变为惰性。 (否定字符类是首选,因为它减少了回溯。)

+0

我已经开始了类似的事情。它不起作用,因为'。*'从一开始就捕获所有东西,而第二个组则是空的。 – Kobi 2010-06-03 06:34:52

+0

你需要添加一个“?”直接在。*之后使其非贪婪。 – annakata 2010-06-03 06:38:00

+0

@annakata - 你还需要在最后加上'$' - 或者两个组都将是空的! – Kobi 2010-06-03 06:39:01

0

也可以这样加入,更容易理解。

^~/buying/(.*)(\?(.*))?$

+0

不起作用 - 请参阅我对LC的评论。你可以不贪心,并在最后加上'$',但是它不再那么容易理解了:) – Kobi 2010-06-03 06:37:07

相关问题