【问题标题】:Is it possible to join these two regex expressions into one?是否可以将这两个正则表达式合并为一个?
【发布时间】:2010-06-03 06:23:44
【问题描述】:

我有以下两个regular expressions(按顺序排列)。

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

我要做的是,如果 url 有问号,则将其分成两组。否则,把所有的东西都扔到第一组。

顺序对我很重要的原因是,如果我将它们调换,'?'正则表达式永远不会被触发,因为 #2 表达式(上图)将捕获所有内容。

所以..这可以重新修复吗?

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

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

【问题讨论】:

  • 这是 perl 吗?我建议你这样标记它。

标签: regex simplify simplification


【解决方案1】:

试试这个:

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

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

【讨论】:

    【解决方案2】:

    让第二部分成为可选(未经测试)怎么样:

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

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

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

    【讨论】:

    • 我从类似的东西开始。它不起作用,因为.* 从一开始就捕获了所有内容,使第二组为空。
    • 您需要添加一个“?”直接在 .* 之后使其不贪婪。
    • @annakata - 您还需要在末尾添加 $ - 否则两个组都将始终为空!
    • @Kobi 是的,好点。在那之后,你的也更容易阅读。
    【解决方案3】:

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

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

    【讨论】:

    • 不起作用 - 请参阅我对 LC 的评论。你可以不贪心并在最后添加$,但这样就不再那么容易理解了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多