0

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

字符串应仅由小写字母数字字符 (az) 组成,并且应允许在其中包含单个“-”。例如,“trash-bin”应该可以,但是“trash--bin”或“-bin”不应该。

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

到目前为止,如果有的话:

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

UPDATED TO:

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

我不知道如何禁止多个 - 相互跟随,或禁止字符串以 - 开头。

4

4 回答 4

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

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

于 2012-12-17T21:39:58.960 回答
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 

正则说明:

^           # 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
于 2012-12-17T21:44:05.523 回答
0

如果您只需要一个 hiphen 并且也应该只在两个或多个字符之间(所有小写字母),那么也许您可以取消以下操作:

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

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

于 2012-12-17T21:46:32.203 回答
0

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

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

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

后跟一些字母数字(一个或多个必需的匹配项)。关闭子模式。[从您最初的问题来看,尚不清楚字符串中是否应该只允许一个破折号,或者只要它们不连续就可以允许多个破折号。如果允许多个,则允许零个或多个子模式匹配。否则允许零个或一个匹配]

那么模式是:

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

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

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

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

于 2012-12-17T21:53:02.797 回答