-1

我有这样的网址

http://www.abc.com/h/x/y

我想使用正则表达式从中解析“x/y”。我正在使用以下正则表达式

h/(?<Group>[\s\S]*?)\s*?/

但它只匹配“x”,但我想要“x/y”。我可以使用编程语言找到“/”的第二次出现,然后对其进行解析,但我只想从正则表达式中进行。

请帮忙。

4

3 回答 3

0

我有一个更简单的解决方案。请进行 string.Length 验证检查,这是一个快速模型。

    string myString = @"http://www.microsoft.com/products/surface/order/pay.aspx";
    char charToFind = '/';
    int nthOccuranceToFind = 4;
    int startIndex = -1;
    int nthPosOfCharToFind = 0;

    while (nthOccuranceToFind > 0)
    {
        int findIndex = startIndex + 1;
        startIndex = myString.IndexOf(charToFind, findIndex);
        --nthOccuranceToFind;
    }

    //startIndex here will contain index of nth occurance.
于 2013-04-05T09:32:27.533 回答
0

我不会使用正则表达式,而只是:

var url = "http://www.abc.com/h/x/y";
var ix1 = url.LastIndexOf('/');
var ix2 = url.LastIndexOf('/', ix1 - 1);
var part = url.Substring(ix2 + 1);

这个是可以理解的,不需要解释复杂的正则表达式:)

(+ 验证它是否是一个有效的 url 可以在实际解析之前单独完成)

于 2013-04-05T09:09:09.717 回答
0

最终的正则表达式最喜欢取决于您想要解析的有效 URL,例如是h常量还是也可以更改?

我可能会使用这样的东西:

http://(?:[a-z\d\-]+\.)*[a-z\d]+/h/(.*)
  • 与协议匹配的第一部分 ( http://) 相当明显。
  • (?:[a-z\d\-]+\.)*带有量词的非捕获组 ( )*将匹配 TLD 下的所有(子)域,包括最后一个.(如果有)。如果给出了 IP,这将包含 IP 的第一部分。
  • [a-z\d]+将匹配 TLD 或 - 对于 Intranet 内容 - 域名(如localhost)。如果给出了 IP,这将包含最后一个字节。
  • 实际的捕获 Group( (.*)) 将简单地捕获/h/.

这种实现有两个缺点:

  • 在当前状态下,不支持 IPv6 IP。也没有给出端口号或其他协议。这些将需要最小的调整,我相信您可以自己解决。
  • 这仍然会解析无效的 URL,例如http://--some-weird.--.com/h/1/2/3.
于 2013-04-05T09:24:42.063 回答