无法弄清楚具体的正则表达式

时间:2012-12-17 21:32:52

标签: php regex

我将创建一个匹配以下内容的正则表达式:

  

字符串应该只包含小写字母数字字符(a-z),并且应该允许单个“ - ”。例如,'trash-bin'应该没问题,但是'trash-bin'或'-bin'不应该。

正则表达式应该如何?如果可以解释的话,我会很高兴。

如果到目前为止就是这样:

/^[0-9a-z]+-+$/

UPDATED TO:

^(\ A - ?!)+ [0-9A-Z] + - $

我不知道的是如何禁止其中几个 - 相互关注,或者禁止字符串以 - 开头。

4 个答案:

答案 0 :(得分:1)

^([a-z0-9]+(\-[a-z0-9]+)*)$

这可能会成功。在http://www.regextester.com/进行测试(选择 preg 方言,因为它是php的preg_*函数使用的方言)

答案 1 :(得分:0)

您想要^[a-z0-9]+(-[a-z0-9]+)*$

$str=array("trash-bin","TRASH-Bin","232trash-bin","-trash-bin","trash","t--b");

foreach ($str as $val) {
  preg_match('/^[a-z0-9]+(-[a-z0-9]+)*$/',$val,$match);
  echo $match[0];
}

>>> trash-bin
>>> 123trash-bin
>>> trash 

Regexplanation:

^           # Match the start of the string
[a-z0-9]+   # Followed by one or more lowercase letter or digit
(-          # Followed by an hyphen
[a-z0-9]+   # Followed by one or more lowercase letter or digit 
)*          # Pattern inside brackets can occur zero or more times
$           # Followed by the end of the string

答案 2 :(得分:0)

如果你只需要一个连字符,并且也只需要两个或更多个字符(所有小写字母),那么也许你可以取消以下内容:

^[a-z0-9]+-?[a-z0-9]+$

测试@ http://www.pagecolumn.com/tool/pregtest.htm

答案 3 :(得分:0)

首先发现字符串以字母数字开头,并持续一段时间(一个或多个必需匹配)。

然后我们启动一个子模式,这样我们可以确保如果你匹配字符串中的连字符,你还需要匹配更多的字母数字。

在子模式中允许单个 - (转义以避免否定下面的类)

跟随一些字母数字(一个或多个必需的匹配)。 关闭子模式。 [从你原来的问题来看,目前尚不清楚是否只允许在字符串中使用一个短划线,或者只要它们不连续就可以允许多个短划线。如果允许的倍数,则允许零个或多个子模式匹配。否则允许零或一个匹配]

然后模式是:

^([:alnum:]+(\-[:alnum:]+)?)$

(只允许一个破折号,或者没有)或

^([:alnum:]+(\-[:alnum:]+)*)$

对于潜在的多个破折号但不连续(即没有双破折号)