c#regex - 在命名组之后匹配选项

时间:2011-03-21 09:32:57

标签: c# regex

我确信这已经很多次,但是虽然我已经检查了所有类似的问题,但我无法提出解决方案。

问题是我的输入网址类似于;

  1. http://www.justin.tv/peacefuljay
  2. http://www.justin.tv/peacefuljay#/w/778713616/3
  3. http://de.justin.tv/peacefuljay#/w/778713616/3
  4. 我想匹配它的slug部分(在上面的例子中,它是和平的)。

    我到目前为止尝试过的正则表达式是

     http://.*\.justin\.tv/(?<Slug>.*)(?:#.)?
     http://.*\.justin\.tv/(?<Slug>.*)(?:#.)
    

    但我无法找到解决方案。要么在第一个网址中失败,要么在其他网址中失败。

    帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

解析Uri的最简单方法是使用Uri类:

string justin = "http://www.justin.tv/peacefuljay#/w/778713616/3";
Uri uri = new Uri(justin);
string s1 = uri.LocalPath; // "/peacefuljay"
string s2 = uri.Segments[1]; // "peacefuljay"

如果您对正则表达式不感兴趣,可以尝试更具体一些:

Match mate = Regex.Match(str, @"http://(\w+\.)*justin\.tv(?:/(?<Slug>[^#]*))?");
  • (\w+\.)* - 确保您匹配域,而不是字符串中的任何其他位置(例如,哈希或查询字符串)。
  • (?:/(?<Slug>[^#]*))? - 包含您需要的字符串的可选组。 [^#]限制了你期望在你的slug中看到的角色,所以它应该消除后面的额外组的需要。

答案 1 :(得分:2)

我认为没有理由在“slug”之后对零件进行处理。

因此,您只需要匹配主机之后不是“/”或“#”的所有字符。

http://.*\.justin\.tv/(?<Slug>[^/#]+)

答案 2 :(得分:0)

http://.*\.justin\.tv/(?<Slug>.*)#*?

http://.*\.justin\.tv/(?<Slug>.*)(#|$)