Regex用于检查某些扩展名或无扩展名,并且只有0-9、a-z和连字符
我正在寻找一个只匹配某些文件名和扩展名的正则表达式 文件名可能有扩展名,也可能没有扩展名,例如test和test.txt是有效的,但如果它确实有扩展名,则必须限制为某些扩展名,例如仅.txt或.md,但仅限于这2个扩展名。它还需要仅限于a-z和0-9以及连字符/破折号,但不应以破折号结束 不确定它是否有用,但我在下面列出了一些有效的和无效的。我正在使用一个现有的正则表达式,它在没有扩展的情况下运行良好-Regex用于检查某些扩展名或无扩展名,并且只有0-9、a-z和连字符,regex,Regex,我正在寻找一个只匹配某些文件名和扩展名的正则表达式 文件名可能有扩展名,也可能没有扩展名,例如test和test.txt是有效的,但如果它确实有扩展名,则必须限制为某些扩展名,例如仅.txt或.md,但仅限于这2个扩展名。它还需要仅限于a-z和0-9以及连字符/破折号,但不应以破折号结束 不确定它是否有用,但我在下面列出了一些有效的和无效的。我正在使用一个现有的正则表达式,它在没有扩展的情况下运行良好-^([a-zA-Z0-9]+([a-zA-Z0-9]+*)$,但一旦我将扩展引入其中,我似乎就
^([a-zA-Z0-9]+([a-zA-Z0-9]+*)$
,但一旦我将扩展引入其中,我似乎就找不到解决方案。我看了几个答案,很接近,但这允许字符不是a-z或0-9或连字符,我无法解决如何更正它
有效/匹配测试
test.txt
test.md
测试一
test-one.md 无效/不匹配
test.jpg
测试一个
测试一个.jpeg
测试-如何匹配扩展? 正如我在最初的评论中提到的,您的正则表达式格式良好;您只需要为扩展添加一个可选组:
(\(md|txt))?
我还切换了前两组的顺序以提高效率(如果未找到-
,则防止不必要的回溯)
下面的正则表达式将此逻辑添加到您的模式中。我还删除了围绕整个模式的捕获组,因为这不是必需的。如果需要,可以始终使用第二种模式将每个零件放入不同的组中。如果您不需要任何组,请使用下面的第三种模式(假设您的正则表达式引擎支持非捕获组),如果您需要两个组:一个用于扩展名,一个用于文件名,请使用下面的第四种模式(假设相同):
如何使它变短?
此外,您可以在某些正则表达式引擎中用[a-zA-Z0-9]
替换以下字符集:
# any letter in range a-z or any digit
# use case-insensitive flag to also match A-Z
[a-z\d]
# any character that's not not a word, and not _
# in other words, any word character ([a-zA-Z0-9_]) except _ ; so `[a-zA-Z0-9]`
[^\W_]
最短模式:
^([^\W_]-?)*[^\W_](\.(md|txt))?$
如何提高效率? 最有效的模式(您可以使用任何字符类替换,而无需更改此模式完成所需的步骤数-我将其默认为最短版本的
[^\W\uz]
):
这可能会起作用:
(^([a-zA-Z0-9\-_]+)$|^([a-zA-Z0-9\-_]+\.(txt|md))$)
^[a-zA-Z0-9]+([a-zA-Z0-9]+)*(\.(md|txt))?$
您的正则表达式格式良好,只需为扩展添加可选组。根据语言的不同,您也可以这样缩短这个正则表达式:^[^\W\u]+([^\W\u]+)*(\.(md\124; txt))?$
或^[a-z\d]+(\.(md\124; txt))?$
,带有不区分大小写的标记,适用于我尝试过的所有测试用例-谢谢。我不能将评论标记为答案,但我很高兴这是一个被接受的答案。我添加了我的评论作为答案,并添加了更多细节,包括更好、更高效的模式。如果可能的话,我建议使用我答案中的最后一种模式(或者基于替代品列表的变体)。这并不能使OP描述的不匹配模式无效。
^([^\W_]+-)*[^\W_]+(\.(md|txt))?$
# if your regex engine accepts possessive quantifiers, use this to prevent backtracking
^([^\W_]+-)*+[^\W_]++(\.(md|txt))?$
^^ ^^
(^([a-zA-Z0-9\-_]+)$|^([a-zA-Z0-9\-_]+\.(txt|md))$)