正则表达式用于Javascript中的用户名,而不是用户名

时间:2017-02-06 18:35:35

标签: javascript regex

我已经尝试了一段时间并且失败了,对正则表达式不是那么好,我需要的是以下内容:

用户名(人名不是用户名)

它可以包括 - 因为某些名称中包含连字符(允许最多2个)

它可以包含一个空格(最多3个)

它不能包含数字,必须以不是连字符的字母开头

它必须至少有3个字符,最多30个

它必须适用于非英文字母的人(例如Agnès)

我尝试了这个,但它失败了,它允许以数字开头但没有 接受非英语字母,如è或ï

^[a-zA-Z\-]{3,30}$

任何帮助都将受到高度赞赏,我认为这将有助于许多程序员搜索SO

1 个答案:

答案 0 :(得分:0)

我认为这可能就是答案:

/** Check if name is valid.
 * @param {String} name
 * @returns {Boolean}
 */
const validateName = (name) => {
    name = name.trim().replace(/\s+/, ' ')
    if (name.length > 30 || name.length < 3) return false // length is too long or too short
    if ((name.match(/-/g) || []).length > 2) return false // more than 2 '-' found
    if ((name.match(/\s+/g) || []).length > 3) return false // more than 3 'whitespace chains' found
    if (name.match(/[~`!@#$%^&*()_=+\d[\]{}\\|:;"'<>,.\/?]/)) return false // not alowed char found
    name = name.split(/\s+/g)
    for (let part of name)
        if (part[0] === '-') return false // part of name starts with -

    return true
}

console.log(`Agnès Jaszenko: ${validateName("Agnès Jaszenko")}`) // valid
console.log(`Ag: ${validateName("Ag")}`) // too short
console.log(`Aga-ta roko-la-foo: ${validateName("Aga-ta roko-la-foo")}`) // too many -
console.log(`Agata Jolanta Krzyżtofska-Brzęczyszczewiczykówna: ${validateName("Agata Jolanta Krzyżtofska-Brzęczyszczewiczykówna")}`) // to long
console.log(`   Pan     Janusz   Kocioł  : ${validateName("   Pan     Janusz   Kocioł  ")}`) // valid
console.log(`Maciej Kozieja: ${validateName("Maciej Kozieja")}`) // fancy :3 hah :P - valid
console.log(`-Łarjusz Miętocha: ${validateName("-Łarjusz Miętocha")}`) // starting with -
console.log(`Łarjusz@ Miętocha: ${validateName("Łarjusz@ Miętocha")}`) // not alowed char
console.log(`محمد: ${validateName("محمد")}`) // valid with arabic symbols
console.log(`مح1مد: ${validateName("مح1مد")}`) // not valid char found

您可以修改此代码并向用户返回有关无效内容的信息,或者只是像这样使用它 希望它适合你:D

它是如何工作的?

第1步 .trim()在开始和结束时删除所有空格 第2步 .replace(/\s+/, ' ')将所有空格替换为exacly one space(这样做可以使'Name Name'有效并且'缩短长度' - 实际的单词数量)
第3步 name.length > 30 || name.length < 3检查长度
第4步 name.match(/-/g)计算' - '
遗憾的是,当他们没有计数匹配和简单的名称。匹配(/ - / g)。长度会在没有找到匹配时中断,这就是为什么我们必须使用''''''''''''''''''''' /> 第5步 name.match(/\s+/g)计算空格 第6步 name.match(/[~`!@#$%^&*()_=+\d[\]{}\\|:;"'<>,.\/?]/)检查姓名是否包含任何未归属的字符 遗憾的是,如您所知\d不足以检查所有语言,但您可以撤消此过程并检查名称是否包含任何不允许的字符
第7步检查单词的一部分是否以 -
开头 第8步如果所有测试都通过了您的名字,并且返回了true,那么

实时预览:

/** Check if name is valid.
 * @param {String} name
 * @returns {Boolean}
 */
const validateName = (name) => {
    name = name.trim().replace(/\s+/g, ' ')
    if (name.length > 30 || name.length < 3) return false // length is too long or too short
    if ((name.match(/-/g) || []).length > 2) return false // more than 2 '-' found
    if ((name.match(/\s+/g) || []).length > 3) return false // more than 3 'whitespace chains' found
    if (name.match(/[~`!@#$%^&*()_=+\d[\]{}\\|:;"'<>,.\/?]/)) return false // not alowed char found
    name = name.split(/\s+/g)
    for (let part of name)
        if (part[0] === '-') return false // part of name starts with -

    return true
}

const input = document.createElement('input')
const valid = document.createElement('p')
input.addEventListener('keyup', () =>{
  valid.innerHTML = validateName(input.value)
})
document.body.append(input)
document.body.append(valid)