C# 要匹配路径的正则表达式

C# 要匹配路径的正则表达式,c#,asp.net,regex,C#,Asp.net,Regex,我正在尝试验证用户输入的字符串是否为正确的相对路径 它不应该以资产/ 它不应以/ 它不应该以任何文件扩展名结尾,如.html或.php或.jpg 它不应包含点 我正在尝试使用下面的正则表达式,但它不能正常工作 ^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+)) 我的测试用例 有效路径 示例/您好/图片 示例/您好/视频/用户/数据 测试/123/用户\现场/图像 无效路径 资产/样本/您好/图像 示例/您好/视频/用户/数据/ test/12

我正在尝试验证用户输入的字符串是否为正确的相对路径

  • 它不应该以资产/
  • 它不应以/
  • 它不应该以任何文件扩展名结尾,如.html或.php或.jpg
  • 它不应包含点
我正在尝试使用下面的正则表达式,但它不能正常工作

^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))
我的测试用例

有效路径

  • 示例/您好/图片
  • 示例/您好/视频/用户/数据
  • 测试/123/用户\现场/图像
无效路径

  • 资产/样本/您好/图像
  • 示例/您好/视频/用户/数据/
  • test/123/user_live/images/index.html
  • hii/sk.123/data
  • 确定/再见/last.exe

    • 对于您提到的场景,以下正则表达式应该可以使用:

      ^((?!(assets\/))(?! )([a-zA-Z0-9_ ]+(?<! )\/(?! ))+[a-zA-Z0-9_ ]+)$
      
      ^((?!(资产\/)(?!)([a-zA-Z0-9\+(?)?
      
      除了问题中的场景之外,我还注意到文件夹名称不以空格开头或结尾。

      这适用于您的测试用例

      Regex explained:
      ^(?!assets/) # It should not start with assets/
      [^\.]+       # It should not contain dot (file extensions contain a dot)
      (?<!/)$      # It should not end with /
      
      Regex in one line:
      ^(?!assets/)[^\.]+(?<!/)$
      
      Regex解释:
      ^(?!assets/)#不应以资产开头/
      [^\.]+#不应包含点(文件扩展名包含点)
      
      (?如果还希望匹配下划线,可以将其添加到字符类中。要防止在开始时匹配
      assets/
      ,可以使用负前瞻

      ^(?!assets/)[a-z0-9_]+(?:/[a-z0-9_]+)+$
      
      • ^
        字符串的开头
      • (?!assets/)
        断言直接右边的不是
        assets/
      • [a-z0-9\]+
        对列出的任何选项重复1+次,包括下划线
      • (?:/[a-z0-9_]+)+/
        重复1+次a
        /
        和1+次所列的任何一个步骤
      • $
        字符串结尾

      或者可以使用
      \w
      而不是字符类

      ^(?!assets/)\w+(?:/\w+)+$
      

      您可以尝试以下正则表达式来实现您的目的:

      ^(?!assets\/)[^.]*?$(?<!\/\r?$)
      
      您可以在可选的“可读”方法中找到上述代码的示例运行;)


      您是否只需要它是一个正则表达式,或者可以使用System.IO.Path的方法?“它不应该包含一个点”,这将足以排除.jpg、.pdf etcpath可以包含比
      [a-z0-9]更多的字符+<代码> >考虑使用<代码> \W+。为什么这个答案被否决了?请至少提一下原因。我确信回答者可以在回答中提供有效缺陷时纠正这些东西。我没有看到任何BTW.
      
      using System;
      using System.Text.RegularExpressions;
      
      public class Example
      {
          public static void Main()
          {
              string pattern = @"^(?!assets\/)[^.]*?$(?<!\/\r?$)";
              string input = @"sample/hello/images
      sample/hello_vid/user/data
      test/123/user_live/images
      assets/sample/hello/images
      sample/hello_vid/user/data/
      test/123/user_live/images/index.html
      hii/sk.123/data
      ok/bye/last.exe";
              RegexOptions options = RegexOptions.Multiline;
              
              foreach (Match m in Regex.Matches(input, pattern, options))
              {
                  Console.WriteLine(m.Value);
              }
          }
      }
      
      public static bool IsValidPath(this string path)
      {
          if (string.IsNullOrEmpty(path)) return false;
          if (path.StartsWith("assets/")) return false;
          if (path.EndsWith("/")) return false;
          if (path.Contains(".")) return false;
      
          return true;
      }
      
      // Usage
      var value = "sample/hello/images";
      if (value.IsValidPath())
      {
          // use the value...
      }