字母,数字和-的正则表达式


100

我无法在PHP中检查值是否为以下任意组合

  • 字母(大写或小写)
  • 数字(0-9)
  • 下划线(_)
  • 破折号(-)
  • 点(。)
  • 空间不足!或其他字符

一些例子:

  • OK:“ screen123.css”
  • OK:“ screen-new-file.css”
  • OK:“ screen_new.js”
  • 不稳定:“屏蔽新的file.css”

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


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

Answers:


207

您想要的模式类似于(在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参考


规格说明

这似乎符合您的规范,但请注意,这将与.....,等类似,它们可能符合您的要求,也可能不是您想要的。如果可以更具体地指定要匹配的模式,则正则表达式会稍微复杂一些。

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

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


另请参见ideone.com/5DMCa,以获取其他规格或更多的规格。如果您想与我一起制定规格,请在rubular上与我来回交流。
polygenelubricants 2010年

我正在使用Tornado,并且需要捕获html名称,因此我根据您的回答使用了它;^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon 2015年

我要添加另一个规则,即:最后一个字符应为字母数字。更新的正则表达式:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

Go(golang)用户,请抬头,这里的模式将导致false空的原始字符串文字。操场。使用下面的 @nonopolarity解决方案。
BentCoder

15

您可以使用

^[\w\d_.-]+$

+是确保它至少有1个字符。需要使用^$来表示开始和结束,否则,如果字符串在中间有一个匹配项(例如),@@@@xyz%%%%则它仍然是一个匹配项。


3
将第-一个放在集合中,以避免定义范围。并\w涵盖字母数字和下划线。所以你需要[\w.-]+
理查德(Richard)2010年

谢谢,这对我来说效果很好:^ [\ w \ d _.-] + \。(csv | CSV)$
Dharam Mali

这也符合Go的(golang)空原始字符串文字,而可接受的答案并不符合,因此Go用户坚持使用此解决方案。游乐场
BentCoder

8

为了真正涵盖您的模式,即根据您的规则提供有效的文件名,我认为您还需要更多。请注意,从系统角度来看,这与合法文件名不匹配。那将取决于系统,并且在接受方面更加自由。这是为了匹配您可接受的模式。

^([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

这是您正在寻找的模式

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

这意味着什么:

  • ^ 字符串开始
  • [...] 匹配里面的字符
  • \w 任何单词字符 0-9 a-z A-Z
  • -_.匹配-_.
  • * 零个或多个图案或无限
  • $ 字符串结尾

如果要限制字符数:

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

{0,5}意思是0-5字符


var a = / ^ \ w * $ / g a.test(“ 46545”),结果为假
Dipak

1
请注意,\w其中包括_
hxpax

4

这样的事情应该工作

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

这将回显“无效”


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.