匹配正则表达式中的可选斜杠

Posted

技术标签:

【中文标题】匹配正则表达式中的可选斜杠【英文标题】:Matching optional slash in regex 【发布时间】:2018-06-05 00:37:25 【问题描述】:

我需要一个匹配 url 中三个“/”字符之间的前两个单词的正则表达式:例如。在 /en/help/test/abc/def 中它应该匹配 /en/help/。

我使用这个正则表达式:/.*?/(.*?)/ 但是有时我的网址没有最后一个斜杠,例如 /en/help 由于缺少最后一个斜杠而不匹配。

您能帮我调整正则表达式以仅匹配“/en/help”部分吗?谢谢

【问题讨论】:

【参考方案1】:

解决它的一个简单方法是将不情愿的(.*?)/替换为贪婪的([^/]*)

/.*?/([^/]*)

如果有一个斜杠,这将在第三个斜杠处停止,如果最后一个斜杠不存在,则在字符串的末尾。

请注意,您可以将 .*? 替换为相同的 [^/]* 表达式以保持一致性:

/[^/]*/([^/]*)

【讨论】:

【参考方案2】:

如果字符包含字母数字,那么您可以使用以下模式:

static void Main(string[] args)

    string s1 = "/en/help/test/abc/def";
    string s2 = "/en/help ";
    string pattern = 
        @"(?ix)   #Options
          /       #This will match first slash
          \w+     #This will match [a-z0-9]
          /       #This will match second slash
          \w+     #Finally, this again will match [a-z0-9] until 3-rd slash (or end)";
    foreach(string s in new[]  s1, s2)
    
        var match = Regex.Match(s, pattern);
        if (match.Success) Console.WriteLine($"Found: 'match.Value'");
    

【讨论】:

以上是关于匹配正则表达式中的可选斜杠的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 C# - 中间的可选组

c# 正则表达式捕获

正则表达式匹配一美元,前面没有反斜杠

正则表达式 反斜杠的匹配 2018-11-30

正则表达式省略 UPN 或 displayName 中的可选前缀

python正则表达式