这两个正则表达式能否合并成一个?

3

我有以下两个正则表达式(按照顺序)。

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

我想做的是,如果URL中有问号,则将其分成两组。否则,只需将所有内容放入第一组。
对我来说,顺序很重要的原因是,如果我将它们交换,'?'正则表达式永远不会被触发,因为#2表达式(上面)将捕获所有内容。
那么,这个问题能修复吗?
注意:我已经尝试使用此网站进行调试/微调...但我无法弄清楚。
**我与该网站没有任何关联。**

这是 Perl 吗?我建议你将其标记为 Perl。 - Aryabhatta
3个回答

5

试一下这个:

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

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


1

要不只是把第二部分设为可选的(未经测试):

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

?: 的作用是防止可选部分(需要的部分加上问号)被捕获。

编辑:由于贪婪性,您需要使用否定字符类 [^\?] 或使其变成懒惰模式。(否定字符类更受欢迎,因为它减少了回溯。)


我已经尝试过类似的东西。但它不起作用,因为.*从一开始就捕获了所有内容,导致第二个组为空。 - Kobi
你需要在.*后面直接添加一个"?"来使其变成非贪婪模式。 - annakata
@annakata - 你还需要在末尾添加 $ - 否则两个组将始终为空! - Kobi
@Kobi 是的,说得好。而且在那之后,你的代码也更容易阅读。 - lc.

0

还有一种方法是这样加入,更容易理解。

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


不起作用 - 请看我对LC的评论。你可以选择非贪婪模式,在末尾添加$,但这样就不那么容易理解了 :) - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接