如何匹配字符串的第二次出现与正则表达式?

时间:2013-04-05 08:57:49

标签: c# regex

我有这样的网址

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

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

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

但它只匹配“x”但我想要“x / y”。我可以使用编程语言找到第二次'/',然后解析它,但我只想从正则表达式做。

请帮忙。

3 个答案:

答案 0 :(得分: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可以在实际解析之前单独完成)

答案 1 :(得分:0)

最终正则表达式最依赖于您要解析的有效网址,例如h是常数还是可以改变?

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

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

此实现有两个缺点:

  • 在当前状态下,不支持IPv6 IP。也没有给出端口号或其他协议。这些只需要很少的调整,我相信你可以自己解决。
  • 这仍将解析无效网址,例如http://--some-weird.--.com/h/1/2/3

答案 2 :(得分: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.