Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex用于检查某些扩展名或无扩展名,并且只有0-9、a-z和连字符_Regex - Fatal编程技术网

Regex用于检查某些扩展名或无扩展名,并且只有0-9、a-z和连字符

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]+*)$,但一旦我将扩展引入其中,我似乎就

我正在寻找一个只匹配某些文件名和扩展名的正则表达式

文件名可能有扩展名,也可能没有扩展名,例如test和test.txt是有效的,但如果它确实有扩展名,则必须限制为某些扩展名,例如仅.txt或.md,但仅限于这2个扩展名。它还需要仅限于a-z和0-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))$)