【问题标题】:Logic in a regular expression正则表达式中的逻辑
【发布时间】:2009-04-15 16:11:21
【问题描述】:

我正在整理一些正则表达式来处理将传入链接从旧站点重定向到新站点上的等效页面。我希望我可以在正则表达式中处理以下情况,所以我不必在后端进行:

传入链接: /reservations/inn_details.asp?num=717

重定向链接: /reservations/property-detail.aspx?pid=00717

如您所见,原查询字符串值 717 需要在重定向链接中为 00717。规则是这些 ID 在重定向的 URL 中都需要有五个字符长。

所以我的问题是:是否可以在正则表达式中计算出查询字符串值有多少个字符,然后添加足够多的前导 0 以等于五个字符?

我可以做四个单独的正则表达式来覆盖值是 1、2、3 或 4 位长的情况,但是一举处理所有这些情况会更酷!

谢谢, B.

【问题讨论】:

    标签: regex logic


    【解决方案1】:

    不幸的是,这不是您仅使用正则表达式就能处理的事情。在我看来,最简单的解决方法是更改​​ property-detail.aspx 以进行零填充。

    我的意思是,只需将正则表达式重定向到“/reservations/property-detail.aspx?pid=717”,并让 aspx 文件在 pid 前面添加必要的零,然后再开始获取数据。无论如何都必须有一些代码来清理该输入(或者至少我希望如此),因此可以轻松地将其添加到该部分中。

    【讨论】:

    • 是的,我认为你是对的——我将在代码中执行它,因为这是最适合它的地方。谢谢!
    【解决方案2】:

    如果你想使用 mod_rewrite,有办法做到这一点:

    RewriteCond %{QUERY_STRING} ^(([^&]*&)*)num=(\d+)(.*)
    RewriteCond 0000%3 ^0+(\d{5})$
    RewriteRule ^/reservations/inn_details\.asp$ /reservations/property-detail.aspx?pid=%1 [L,R=301]
    

    【讨论】:

      【解决方案3】:

      不知道在一些随机的正则表达式实现中可能是什么,但至少对于真正的正则表达式来说,没有。

      【讨论】:

        【解决方案4】:

        您还没有解释您调用正则表达式的通用语言。然而,大多数语言都提供了使用正则表达式来匹配和替换文本的工具。匹配字符串的数字部分,然后使用您的语言的特性用前导零填充数字。

        【讨论】:

          【解决方案5】:

          [?&]num=(\d+) 将为您获取价值。但是正则表达式不实现逻辑,只实现模式识别。您的语言或工具集需要提供一种分析和处理它的方法。

          例如在 perl 中,你可以:

          s/([?&])num=(\d+)/sprintf( "%spid=%5.5d", $1, $2 )/e;
          

          但这当然只是解决了您的转换问题之一。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多