字母、数字和 - _ 的正则表达式

213

我在PHP中遇到了一个问题,需要检查一个值是否为以下任意一种组合:

  • 字母(大写或小写)
  • 数字(0-9)
  • 下划线(_)
  • 短横线(-)
  • 点号(.)
  • 没有空格或其他字符!

下面是一些示例:

  • OK: "screen123.css"
  • OK: "screen-new-file.css"
  • OK: "screen_new.js"
  • NOT OK: "screen new file.css"

我想我需要一个正则表达式来实现这个功能,因为当给定的字符串中包含除上述字符以外的其他字符时,我需要抛出一个错误。


^[\w.-]*$ -> 这将获取所有文件名。 - Badri Gs
6个回答

371
您想要的模式类似于(在rubular.com上查看):
^[a-zA-Z0-9_.-]*$

解释:

  • ^ 是行首锚点
  • $ 是行尾锚点
  • [...] 是字符类定义
  • * 表示 "零个或多个" 重复

请注意,字面上的破折号 - 是字符类定义中的最后一个字符,否则它会有不同的含义(即范围)。在字符类定义之外,. 也有不同的含义,但在其中,它只是一个字面上的 .

参考资料


使用 PHP 实现

以下代码片段展示了如何使用该模式:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

上述内容输出为 (在ideone.com上查看):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

请注意,模式略有不同,使用\w代替。这是“单词字符”的字符类。

API参考


规范说明

这似乎符合您的规范,但请注意,这将匹配诸如.....等内容,这可能或可能不是您想要的。如果您能更具体地说明要匹配的模式,则正则表达式会稍微复杂一些。

上述正则表达式还匹配空字符串。如果您需要至少一个字符,请使用+(一个或多个)而不是*(零个或多个)进行重复。

无论如何,您都可以进一步澄清您的规范(在提问正则表达式问题时总是有帮助),但希望您也可以根据以上信息自己编写模式。


请参考http://ideone.com/5DMCa,那里有一个不同的规范,可能更符合您的需求。如果您想与我一起开发规范,请在rubular上来回交流。 - polygenelubricants
我正在使用Tornado并需要捕获HTML名称,因此我根据您的答案使用了这个正则表达式:^/([a-zA-Z0-9._-]*\.html)$ - NuclearPeon
我会添加另一个规则,即:最后一个字符应该是字母数字。更新的正则表达式:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/ - Consta Gorgan
Go(golang)用户注意了,对于空的原始字符串字面量,使用pattern here将导致结果为falsePlayground。请使用@nonopolarity的解决方案下面 - BentCoder
@polygenelubricants 这将匹配包含下划线和点的字符串,我能以某种方式进行过滤吗? - Johny Corbie

53

你可以使用

^[\w.-]+$

使用+可以确保至少有1个字符。需要^$来表示开头和结尾,否则如果字符串在中间有匹配项,比如@@@@xyz%%%%,那么它仍然是一个匹配。

\w已经包含字母(大写和小写)、数字和下划线。因此,其余的符号.-只需放入“类”中进行匹配。 +表示1个或多个出现次数。

附言:感谢评论中提到防止-表示范围的注释。


3
将“-”放在集合的第一位,以避免定义范围。而\w则涵盖了字母数字和下划线。因此需要使用 [\w.-]+ - Richard
谢谢,这对我很有效:^ [\ w \ d_。 -] + \。 (csv | CSV)$ - Dharam Mali
这也符合Go(golang)的空原始字符串字面值,而被接受的答案则不是,因此Go用户坚持使用这个解决方案。Playground - BentCoder
对于那些想要包含空格的人,您可以使用此正则表达式:/^[\w .-]+$/gm - Samyar

20

这是你正在寻找的图案

/^[\w-_.]*$/

这意味着什么:

  • ^ 字符串的开始位置
  • [...] 匹配括号内的字符
  • \w 任何单词字符,包括 0-9a-zA-Z
  • -_. 匹配 -_.
  • * 零个或多个模式
  • $ 字符串的结束位置

如果您想限制字符数量:

/^[\w-_.]{0,5}$/

{0,5} 表示 0-5 个字符


var a = /^\w*$/g a.test("46545")结果为false - Dipak
2
请注意,\w 包括下划线 _ - Galaxy

12

要真正覆盖你的模式,即符合你规则的有效文件名,我认为你需要更多的内容。请注意,这并不符合系统角度的合法文件名。这将取决于系统,并且在接受的范围内更加宽松。这旨在匹配您可接受的模式。

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

解释:

  • ^ 匹配字符串的起始位置。这将强制字符串与表达式完全匹配,而不只是包含一个子字符串。
  • ([a-zA-Z0-9]+[_-])* 零个或多个字母或数字加下划线或减号。这将导致所有包含破折号或下划线的名称之间都有字母或数字。
  • [a-zA-Z0-9]+ 一个或多个字母或数字。这可涵盖所有不包含下划线或破折号的名称。
  • \. 一个字面点(句点)。 强制文件名具有扩展名,并通过从模式的其余部分排除它来仅允许在名称和扩展名之间使用句点。 如果您想要多个扩展名,那么也可以使用与破折号/下划线相同的技术处理它们,只需要放在结尾处。
  • [a-zA-Z0-9]+ 一个或多个字母或数字。 扩展名必须至少为一个字符长,并且必须仅包含字母和数字。 这很典型,但如果您想要允许下划线,也可以解决这个问题。 您还可以提供长度范围{2,3},而不是一个或多个+匹配器,如果更合适的话。
  • $ 匹配字符串的结束位置。见起始字符。

6

这样的做法应该可以正常工作。

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

这将回显“无效”。

3

[A-Za-z0-9_.-]*

这也会匹配空字符串,如果您不想要这个,请将最后一个*换成+


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接