我试图验证用户输入的字符串是否是正确的相对路径。
我正在尝试使用以下正则表达式,但是无法正常工作。
^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))
我的测试用例
有效路径
无效路径
答案 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次以上$
字符串结尾或者您可以使用\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.中找到上述正则表达式的演示
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_ ]+)$
除了问题中的情况外,我还照顾了不以空格开头或结尾的文件夹名称。