【问题标题】:regex expression of getting the string after the last slash and before the question mark获取最后一个斜杠之后问号之前的字符串的正则表达式
【发布时间】:2012-07-06 06:39:46
【问题描述】:

示例 网址 = http://www.example.com/aa/bb/cc/dd?q=ab&c=1

所以在这个网址中,我需要在最后一个斜杠之后和问号之前有值 dd

如何为此编写正则表达式

我已经写了获取最后一个斜杠之后的值,但无法弄清楚如何在查询字符串之前获取唯一的值“dd”。

正则表达式:[^/]+$

【问题讨论】:

  • @ghoti:您正在创建循环引用。你链接的那个因为这个而被关闭了,你试图关闭这个作为那个的副本。这是最古老的,所以它应该保持开放。另一个因重复而被正确关闭。

标签: regex


【解决方案1】:

您可以使用以下正则表达式。此正则表达式将匹配所有后跟? 的字母。在您的情况下,它将是dd

编辑:更新了正则表达式以使用 \w 而不仅仅是字母。

[^\/][\w]+(?=\?)

说明

[^\/] -- Do not match /
[\w]+ -- match word characters (letters, digits, underscore) 
(?=\?) -- Positive lookahead: Match alphabets(above condition) that are followed by a ?

【讨论】:

  • +1 很好地使用了积极的前瞻来防止 ? 匹配。但是,如果它是 /dd9? 而不是 /dd? 呢?所以我建议你使用\w+ 而不是[a-z]*
  • @PavanManjunath:你是对的。我的目的只是为为这个特定问题编写正则表达式提供一个方向。我期待用户对此进行调整以符合他的实际要求。 :-)
【解决方案2】:

这行得通,从技术上讲,它可以获取 '/' 和 '?' 之间的任何内容。您可能需要转义“/”,但我没有看到它在您的中转义,所以我没有转义。

/([^/\?]+)\?

【讨论】:

  • 如果您还想将 URL 与不 ?一点也不。如果您想要以“/?”结尾的 URL 的空字符串,请将 + 更改为 *
  • @KKobayashi 这东西有效,但它适用于第一个斜杠,但我想要最后一个斜杠之后和问号之前的值
  • @Prateek 你用的是什么语言?
【解决方案3】:
#(.*)/(.*)\?(.*)#

由于我不确定您使用的是什么语言,因此我编写了此代码以适用于 PHP。适应您正在使用的任何语言应该不难。

正则表达式的分解:

  • # - 正则表达式的开始和结束符号。
  • (.*)/ - 匹配 url 中最后一个 / 之前的任何内容。
  • (.*)\? - 匹配最后的 /? 之前的内容。
  • 尾随 (.*)# - 匹配 ? 后面的任何内容,通常是查询字符串。

当然,正则表达式可以更短,但这样,如果您认为合适,您也可以使用所获得 URL 的其他详细信息。

编辑

我已使用此代码,以及您提供的示例 URL:

<?php
    $url = "http://www.abc.com/aa/bb/cc/dd?q=ab&c=1";
    $regex = "#(.*)/(.*)\?(.*)#";
    preg_match_all($regex, $url, $matches);
    var_dump($matches);
?>

这是它返回的内容:

array
  0 => 
    array
      0 => string 'http://www.abc.com/aa/bb/cc/dd?q=ab&c=1' (length=39)
  1 => 
    array
      0 => string 'http://www.abc.com/aa/bb/cc' (length=27)
  2 => 
    array
      0 => string 'dd' (length=2)
  3 => 
    array
      0 => string 'q=ab&c=1' (length=8)

如您所见,正则表达式有效。

【讨论】:

  • 我正在使用 php。但情况是我不知道url中有多少个斜杠它可以像这样abc.com/bb/cc/dd?q=ab&c=1abc.com/aa/bb/dd?q=ab&c=1abc.com/aa/bb/cc/dd?q=ab&c=1最终我想要最后一个斜杠之后和查询字符串参数附加之前的值
  • 如果你总是想要最后一个斜线后面的内容,无论如何这都可以。
  • 我正在使用 (.*)\?它仍然从网址的开头给我,但不是最后一个斜杠的值
  • @Prateek 另外,请确保您使用(.*)/(.*)\?(.*),而不仅仅是(.*)\?,否则它将匹配? 之前的everything
  • 谢谢你,但我错过了我正在使用 php nut 这个正则表达式我必须与 apache 一起使用的一件事。无论如何谢谢:)
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 2017-04-20
  • 1970-01-01
  • 2023-01-07
相关资源
最近更新 更多