正则表达式以不同条件开头和结尾,但允许单个字符。

3

我有一个正则表达式需要调试...它的规则如下:

  • 必须以字母开头。
  • 只能包含字母、数字、连字符和下划线。
  • 必须以字母或数字结尾。

我已经得到了以下内容:

/\A^[A-Z]+[A-Z0-9\-_]*[A-Z0-9]$\z/i

这种方法似乎有效,但不允许单个字母通过。所以a会返回false。

3个回答

2
你可以使用基于前瞻的正则表达式,以允许单个字符输入:
/^(?=.*?[A-Z0-9]$)[A-Z][\w-]*$/mgi

正则表达式演示

(?=.*?[A-Z0-9]$)这段代码可以强制要求字符串以字母或数字结尾。


1
非常感谢...我真的无法理解正则表达式,哈哈...即使看了你的演示,我也看不出它是如何工作的...但至少它能用 :D - Just Lucky Really
这个正则表达式与你之前的大部分相同,但我添加了一个重要的前瞻。这个前瞻是 (?=.*?[A-Z0-9]$),它表示只有在结束锚点 $ 前面有字母或数字时才匹配。 - anubhava
本来可以更简单、更优美的,但是预读(lookahead)虽然强大但会降低性能。 - karthik manchala
向前查看用于在正则表达式中强制执行规则。是的,这是一个更简单的情况,但有许多情况是无法避免的。 - anubhava

2

你的正则表达式期望至少有两个字母,因为它使用了 [A-Z]+[A-Z0-9]$

请使用以下内容:

\A^[A-Z](?:[A-Z0-9\-_]*[A-Z0-9])?$\z
        ^^^                     ^

请查看演示
解释:
  • +不是必需的,因为它已经被[A-Z0-9\-_]*覆盖了
  • 将其余模式包含为可选项(使用?),对于一个字符是可选的,但对于多个字符则是强制的。

1
我会选择这样的替代方案:
^([A-Za-z]|[A-Za-z][\w-]*[A-Za-z0-9])$

演示在这里

第一个选择是单个字母,第二个选择是字母或数字或连字符后跟字母或数字0到无限次,并以字母或数字结尾。括号创建一个捕获组并强制该选择在行首和行尾(^$)之间


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接