我试图使用javascript创建一个正则表达式,允许使用像abc-def这样的名称但不允许使用abc- (连字符也是唯一允许的非字母字符)
名称必须至少为2个字符。我开始了 ^ [A-ZA-Z - ] {2,} $ 但它不够好所以我尝试这样的事情 ^([A-ZA-Z] {2,})+( - [A-ZA-Z] +)* $
它可以有一个以上 - 在一个名称中但它永远不应该以 -
开始或结束它允许像xx-x这样的名字,但不允许像x-x这样的名字。我想要实现x-x也被接受但不是x -
谢谢!
答案 0 :(得分:3)
您可以使用否定前瞻:
/(?!.*-$)^[a-z][a-z-]+$/i
<强>故障:强>
// 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)
此选项匹配以字母开头和结尾的字符串,并确保两个-
不连续,因此a--a
之类的字符串无效。要允许这种情况,请参阅选项2 。
^[a-z]+(?:-?[a-z]+)+$
^
在行首处断言位置[a-z]+
匹配任何小写ASCII字母一次或多次(使用i
标志,这也符合大写变体)(?:-?[a-z]+)+
匹配以下一次或多次
-?
可选择匹配-
[a-z]+
匹配任何ASCII字母(带i
标志)$
断言行尾的位置
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;
如果您想匹配a--a
之类的字符串,那么您可以使用以下正则表达式:
^[a-z]+[a-z-]*[a-z]+$
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;
答案 4 :(得分:0)
我建议如下:
^[a-zA-Z][a-zA-Z-]*[a-zA-Z]$
验证:
-
)答案 5 :(得分:0)
^(?=[A-Za-z](?:-|[A-Za-z]))(?:(?:-|^)[A-Za-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-]
模式的两个字符开始的单词,而不是(?!-|.*-$)
的开始或结束-
(负向前瞻)。