这是我的表达:^[a-z][a-z0-9_]+[a-z0-9]$
现在它什么都不匹配。我如何使它匹配ems_agencies
但不匹配ems_agencies_
?
如果它“不匹配任何东西”,那么您可能使用了错误的正则表达式方言。是 ERE的+
一个元素,在 BRE 中不起作用。例如,如果您将其与grep
命令一起使用,那么您需要将其作为egrep
或使用该-E
选项来运行。
$ printf 'ems_agencies\nems_agencies_\n' | egrep '^[a-z][a-z0-9_]+[a-z0-9]$'
ems_agencies
$ printf 'ems_agencies\nems_agencies_\n' | grep '^[a-z][a-z0-9_]+[a-z0-9]$'
$
如果您告诉我们您使用此正则表达式的环境,它可能有助于缩小答案范围。
在某些情况下,可以将 ERE 转换为 BRE。例如[a-z0-9]+
,你可以写而不是写[a-z0-9][a-z0-9]*
。这将以牺牲可读性为代价在所有正则表达式实现中普遍适用。
printf "ems_agencies\nems_agencies_\n" | grep '^[a-z][a-z0-9_][a-z0-9_]*[a-z0-9]$'
ems_agencies
你的表达效果很好。见这里:http ://regex101.com/r/gM1zM2
供将来参考:[0-9]
与 相同\d
且[a-z0-9_]
等于\w
。请记住,虽然这\w
是不区分大小写的