C# 如何将第二次出现的字符串与正则表达式匹配?
我有一个这样的URLC# 如何将第二次出现的字符串与正则表达式匹配?,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
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://
- 带有
量词的非捕获组(*
)将匹配TLD下的所有(子)域,包括最后一个(?:[a-z\d\-]+\)*
(如果有)。如果给定IP,则该IP将包含IP的第一部分
将匹配TLD或-对于intranet内容-域名(如[a-z\d]+
)。如果给定了IP,则将包含最后一个字节localhost
- 实际的捕获组(
)将只捕获(.*)
之后的任何内容/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)
…如何定义更简单的字符?