正则表达式 - 不允许名称以连字符

时间:2018-04-09 16:03:09

标签: javascript regex

我试图使用javascript创建一个正则表达式,允许使用像abc-def这样的名称但不允许使用abc- (连字符也是唯一允许的非字母字符)

名称必须至少为2个字符。我开始了  ^ [A-ZA-Z - ] {2,} $ 但它不够好所以我尝试这样的事情 ^([A-ZA-Z] {2,})+( - [A-ZA-Z] +)* $

它可以有一个以上 - 在一个名称中但它永远不应该以 -

开始或结束

它允许像xx-x这样的名字,但不允许像x-x这样的名字。我想要实现x-x也被接受但不是x -

谢谢!

7 个答案:

答案 0 :(得分:3)

您可以使用否定前瞻:

/(?!.*-$)^[a-z][a-z-]+$/i

Regex101 Example

<强>故障:

// Negative lookahead so that it can't end with a -
(?!.*-$)

// The actual string must begin with a letter a-z
[a-z]

// Any following strings can be a-z or -, there must be at least 1 of these
[a-z-]+

let regex = /(?!.*-$)^[a-z][a-z-]+$/i;

let test = [
  'xx-x',
  'x-x',
  'x-x-x',
  'x-',
  'x-x-x-',
  '-x',
  'x'
];

test.forEach(string => {
  console.log(string, ':', regex.test(string));
});

答案 1 :(得分:1)

问题是第一个断言接受2个或更多[A-Za-z]。您需要修改它以接受一个或多个字符:

^[A-Za-z]+((-[A-Za-z]{1,})+)?$

编辑:解决了一些评论问题

/^[A-Za-z]+((-[A-Za-z]{1,})+)?$/.test('xggg-dfe'); // Logs true
/^[A-Za-z]+((-[A-Za-z]{1,})+)?$/.test('x-d'); // Logs true
/^[A-Za-z]+((-[A-Za-z]{1,})+)?$/.test('xggg-'); // Logs false

编辑2:已修改为仅接受字符

/^[A-Za-z]+((-[A-Za-z]{1,})+)?$/.test('abc'); // Logs true

答案 2 :(得分:0)

试试这个/([a-zA-Z]{1,}-[a-zA-Z]{1,})/g

答案 3 :(得分:0)

选项1

此选项匹配以字母开头和结尾的字符串,并确保两个-不连续,因此a--a之类的字符串无效。要允许这种情况,请参阅选项2

^[a-z]+(?:-?[a-z]+)+$
  • ^在行首处断言位置
  • [a-z]+匹配任何小写ASCII字母一次或多次(使用i标志,这也符合大写变体)
  • (?:-?[a-z]+)+匹配以下一次或多次
    • -?可选择匹配-
    • [a-z]+匹配任何ASCII字母(带i标志)
  • $断言行尾的位置

&#13;
&#13;
var a = [
  "aa","a-a","a-a-a","aa-aa-aa","aa-a", // valid
  "aa-a-","a","a-","-a","a--a" // invalid
]
var r = /^[a-z]+(?:-?[a-z]+)+$/i

a.forEach(function(s) {
  console.log(`${s}: ${r.test(s)}`)
})
&#13;
&#13;
&#13;

选项2

如果您想匹配a--a之类的字符串,那么您可以使用以下正则表达式:

^[a-z]+[a-z-]*[a-z]+$

&#13;
&#13;
var a = [
  "aa","a-a","a-a-a","aa-aa-aa","aa-a","a--a", // valid
  "aa-a-","a","a-","-a" // invalid
]
var r = /^[a-z]+[a-z-]*[a-z]+$/i

a.forEach(function(s) {
  console.log(`${s}: ${r.test(s)}`)
})
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我建议如下:

^[a-zA-Z][a-zA-Z-]*[a-zA-Z]$

验证:

  • 匹配的字符串至少由两个字符组成(第一个和最后一个字符类恰好匹配一次)
  • 第一个和最后一个字符不是短划线(第一个和最后一个字符类不包括-
  • 字符串可以包含短划线并且大于2个字符(第二个字符类包含短划线,将根据需要使用尽可能多的字符,包括短划线)。

Try it online

答案 5 :(得分:0)

^(?=[A-Za-z](?:-|[A-Za-z]))(?:(?:-|^)[A-Za-z]+)+$

断言

  • 第一个字符是a-z
  • 第二个是a-z或连字符

如果匹配

  • 查找以连字符或字符串开头为前缀的一个或多个字母组,一直到字符串结尾。

您也可以使用I开关使其不区分大小写。

答案 6 :(得分:0)

如果您还想接受A---A,请使用此选项:

^(?!-|.*-$)[A-Za-z-]{2,}$

https://regex101.com/r/4UYd9l/4/

如果您不想接受A---A这样做:

^(?!-|.*[-]{2,}.*|.*-$)[A-Za-z-]{2,}$

https://regex101.com/r/qH4Q0q/4/

因此,两者都只接受从[A-Za-z-]模式的两个字符开始的单词,而不是(?!-|.*-$)的开始或结束-(负向前瞻)。