Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将第二次出现的字符串与正则表达式匹配?_C#_Regex - Fatal编程技术网

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

C# 如何将第二次出现的字符串与正则表达式匹配?,c#,regex,C#,Regex,我有一个这样的URL http://www.abc.com/h/x/y 我想用正则表达式解析其中的“x/y”。我使用下面的正则表达式 h/(?<Group>[\s\S]*?)\s*?/ h/(?[\s\s]*?)\s*/ 但它只匹配“x”,但我想要“x/y”。我可以使用编程语言找到第二个出现的“/”,然后对其进行解析,但我只想从正则表达式中进行解析 请提供帮助。我不会使用正则表达式,只是: var url = "http://www.abc.com/h/x/y"; var ix

我有一个这样的URL

http://www.abc.com/h/x/y
我想用正则表达式解析其中的“x/y”。我使用下面的正则表达式

h/(?<Group>[\s\S]*?)\s*?/
h/(?[\s\s]*?)\s*/
但它只匹配“x”,但我想要“x/y”。我可以使用编程语言找到第二个出现的“/”,然后对其进行解析,但我只想从正则表达式中进行解析


请提供帮助。

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

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)

最终正则表达式将取决于您要解析的有效url,例如,
h
是否为常量,或者它是否也可以更改

我可能会用这样的东西:

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

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

    • 我有一个更简单的解决方案。 请进行字符串。长度验证检查,这是一个快速模型

          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.
      

      旁注:您不认为使用子字符串可能比使用正则表达式更易读、更简单吗?您可以指定要从Url获取的内容吗?如果URL看起来像
      http://www.abc.com/h/x/y/z
      ?为什么只有正则表达式?如果斜杠的数目不断变化,会发生什么?另外,如果
      x
      长度超过一个字符,则返回值也会错误。您在需求中看到了这种可能性吗?我只是根据常识假设(考虑到一个字符,您可能的URL数量非常有限)。@L-Three实际需求很差,不要回答这些问题。在这种情况下,我更喜欢子串,而不是正则表达式,但是在需求不明确的时候,我不能把它看作是答案。所以,基本上这个解决方案假定<代码> x <代码>是一个字符,而代码> y>代码>可以不止一个。为什么会有这种特殊待遇?您可以假设
      y
      也是一个字符,并编写
      子字符串(url,url.Length-3)
      …如何定义更简单的字符?