正则表达式匹配路径

时间:2020-06-11 05:38:33

标签: c# asp.net regex

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

  • 它不应以资产/
  • 开头
  • 它不应以 /
  • 结尾
  • 它不应以.html或.php或.jpg之类的文件扩展名结尾
  • 它不应包含点

我正在尝试使用以下正则表达式,但是无法正常工作。

^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))

我的测试用例

有效路径

  • 样本/您好/图像
  • 样本/ hello_vid /用户/数据
  • test / 123 / user_live / images

无效路径

  • 资产/样本/你好/图像
  • sample / hello_vid / user / data /
  • test / 123 / user_live / images / index.html
  • hii / sk.123 / data
  • 确定/再见/last.exe

5 个答案:

答案 0 :(得分:4)

“可读”的替代方法;)

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...
}

答案 1 :(得分:3)

如果您还想匹配下划线,则可以将其添加到字符类中。为了避免一开始就匹配assets/,您可以使用否定的超前查询。

^(?!assets/)[a-z0-9_]+(?:/[a-z0-9_]+)+$
  • ^字符串的开头
  • (?!assets/)断言直接在右边的不是assets/
  • [a-z0-9_]+重复列出的任何内容(包括下划线)超过1次
  • (?:/[a-z0-9_]+)+/重复1次以上,对所列的任意一个重复1次以上
  • $字符串结尾

Regex demo

或者您可以使用\w代替字符类

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

答案 2 :(得分:1)

这适用于您的测试用例。

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/)[^\.]+(?<!/)$

答案 3 :(得分:1)

您可以尝试使用正则表达式来达到目的:

^(?!assets\/)[^.]*?$(?<!\/\r?$)

上述正则表达式的解释:

^, $ -分别代表行的开始和结束。

(?!assets\/) -表示负匹配,与以assets\开头的测试字符串不匹配。

[^.]*? -匹配所有{strong>懒惰 .以外的内容。这种情况也将涵盖文件扩展名,因此无需再次检查它们。

(?<!\/\r?$) -如果测试字符串包含\作为最后一个字符,则表示不匹配测试字符串。

您可以在here.中找到上述正则表达式的演示

Pictorial Representation 在C#中的实现

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);
        }
    }
}

您可以在here.

中找到上述代码的示例运行

答案 4 :(得分:0)

以下正则表达式适用于您提到的方案:

^((?!(assets\/))(?! )([a-zA-Z0-9_ ]+(?<! )\/(?! ))+[a-zA-Z0-9_ ]+)$

除了问题中的情况外,我还照顾了不以空格开头或结尾的文件夹名称。