【问题标题】:Match text separated by SINGLE forward slash only仅匹配由单个正斜杠分隔的文本
【发布时间】:2018-05-21 17:04:18
【问题描述】:

我正在尝试使用Regex.Split 拆分类似于此的字符串:

要返回这个:

实际上,忽略双正斜杠而只担心单个正斜杠。

我知道我应该使用类似 /(?!/) 的负面展望 - 但无法让它发挥作用。

这不是 Similar Question 的副本,因为如果您通过 Regex.Split 运行该正则表达式,它不会给出所需的结果。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/161738/…
  • @Praveen,虽然我很欣赏你的回答 - 也许你应该再读一遍我的问题。
  • 在上述副本中有一个解决方案,可以使用以下模式 ([^/]+(?://[^/]*)*) 产生完全期望的结果...
  • 为什么不使用Uri 类呢? Uri.Segments 将返回路径的所有段。 Host 将返回 www.linkedin.com。它也不会像正则表达式那样受到查询参数和片段的影响。 new Uri(@"https://www.linkedin.com/in/someone?someparam=foo#tab1").Segments 将返回 \ insomeone

标签: c# .net regex


【解决方案1】:

这个怎么样:(?<!/)/(?!/)

分解:

  • (?<!/):对/ 字符进行负面回溯
  • /:匹配单个 / 字符
  • (?!/)/ 字符的负前瞻

综合起来,我们匹配了一个/ 字符,该字符前后都没有/

示例用法:

string text = "https://www.linkedin.com/in/someone";
string[] tokens = Regex.Split(text, "(?<!/)/(?!/)");
foreach (var token in tokens)
{
    Console.WriteLine($"Token: {token}");
}

输出:

代币:https://www.linkedin.com
代币:在
代币:某人

【讨论】:

  • 你的解决方案比我的好。我不知道为什么我不使用Regex.Split()。 +1 为简单起见。
  • 正是我需要的!
【解决方案2】:

您也可以使用此代码:

string pattern = @"([^\/]+(\/{2,}[^\/]+)?)";
string input = @"https://www.linkedin.com/in/someone";
foreach(Match match in Regex.Matches(input, pattern)) {
    Console.WriteLine(match);
}

输出:

https://www.linkedin.com
在
某人

【讨论】:

    【解决方案3】:

    正如@Panagiotis Kanavos 在上面的 cmets 部分中提到的,当您可以使用 Uri Class 时,为什么要让事情变得复杂:

    提供统一资源标识符 (URI) 的对象表示,并且可以轻松访问 URI 的各个部分。

    public static void Main()
    {
        Uri myUri = new Uri("https://www.linkedin.com/in/someone");   
        string host =  myUri.Scheme + Uri.SchemeDelimiter  + myUri.Host;
        Console.WriteLine(host);        
    }
    

    输出:

    演示:

    dotNetFiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多