正则表达式 - 字母与连字符

时间:2014-05-28 05:34:15

标签: regex

我想要一个正则表达式来检查最多14个字母数字字符串的字符串。可以包括连字符,而不是开头或结尾。

这是我到目前为止所做的:

var patt = new RegExp("^([a-zA-Z0-9]+(-[a-zA-Z0-9])*){1,14}$");

但它不起作用 - http://jsfiddle.net/u6cWs/1/

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你需要使用正向前瞻(带有可选连字符的字母数字字符数)。

如果只允许使用单个连字符:

^(?=([a-zA-Z0-9]-?){1,14}$)[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)?$

Regular expression visualization

<强> Demo

如果允许多个连字符:

^(?=([a-zA-Z0-9]-?){1,14}$)[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$

Regular expression visualization

<强> Demo

附加选项:

^[a-zA-Z0-9](?:-?[a-zA-Z0-9]){0,13}$

Regular expression visualization

<强> Demo

答案 1 :(得分:1)

这是一个更快的简单解决方案,因为它不使用前瞻:

^[A-Za-z0-9](?:[-A-Za-z0-9]{0,12}[A-Za-z0-9])?$

demo

它是如何运作的?

  1. 与原始模式一样,此正则表达式锚定在^$之间,强制限制字符数。
  2. 第一个字符必须是字母或数字。
  3. 包含在(?:非捕获组中的其余字符串最后由?设置为可选。字符串的其余部分(如果有)(多个字符)必须以字母或数字结尾。在中间,你可以有0到12个字母,数字或连字符。
  4. <强>任选地

    如果您希望正则表达式更短一些,请启用不区分大小写的选项,并删除小写字母或大写字母,例如:

    ^[a-z0-9](?:[-a-z0-9]{0,12}[a-z0-9])?$
    

答案 2 :(得分:0)

使用两个正则表达式以简化和可读性。

首先检查它是否匹配:

/^[A-Za-z0-9-]{1,14}$/

然后检查它是否与此匹配:

/^-|-$/