我将创建一个正则表达式来匹配以下内容:
字符串应仅由小写字母数字字符 (az) 组成,并且应允许在其中包含单个“-”。例如,“trash-bin”应该可以,但是“trash--bin”或“-bin”不应该。
正则表达式应该如何?另外,如果可以解释,我会很高兴。
到目前为止,如果有的话:
/^[0-9a-z]+-+$/
UPDATED TO:
^(?!\A-)+[0-9a-z]+-?$
我不知道如何禁止多个 - 相互跟随,或禁止字符串以 - 开头。
^([a-z0-9]+(\-[a-z0-9]+)*)$
这可能会奏效。在http://www.regextester.com/进行测试(选择preg方言,因为它是 phppreg_*
函数使用的方言)
你想要^[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
如果您只需要一个 hiphen 并且也应该只在两个或多个字符之间(所有小写字母),那么也许您可以取消以下操作:
^[a-z0-9]+-?[a-z0-9]+$
首先发现字符串以字母数字开头,并持续一段长度(一个或多个必需的匹配项)。
然后我们开始一个子模式,这样我们就可以确保如果你匹配字符串中的连字符,你还需要匹配更多的字母数字。
在子模式中允许单个 - (转义以避免否定以下类)
后跟一些字母数字(一个或多个必需的匹配项)。关闭子模式。[从您最初的问题来看,尚不清楚字符串中是否应该只允许一个破折号,或者只要它们不连续就可以允许多个破折号。如果允许多个,则允许零个或多个子模式匹配。否则允许零个或一个匹配]
那么模式是:
^([:alnum:]+(\-[:alnum:]+)?)$
(只允许一个破折号,或者没有)或
^([:alnum:]+(\-[:alnum:]+)*)$
对于潜在的多个破折号但不连续(即没有双破折号)