Weboldal keresés

Javascript érvényesítési reguláris kifejezés nevekhez


Olyan neveket szeretnék elfogadni az alkalmazásomban, amelyek betűket és kötőjeleket vagy gondolatjeleket tartalmaznak, a kódomat egy itt talált válasz alapján készítettem el, és így kódoltam:

function validName(n){
  var nameRegex = /^[a-zA-Z\-]+$/;
  if(n.match(nameRegex) == null){
    return "Wrong";
  }
  else{
    return "Right";
  }
}

az egyetlen probléma az, hogy elfogadja a kötőjelet első betűként (akár többször is), amit én nem akarok. köszönöm

Válasz #1

Használjon negatív előrebocsátó állítást a kötőjellel kezdődő karakterláncok elkerülésére. Bár nincs szükség a - karakter elmenekítésére a karakterosztály végén, ha ott szerepel. Használja a - eltávolított karakterosztályt a kötőjel végén való elkerüléséhez, vagy használjon előrebocsátó állítást.

var nameRegex = /^(?!-)[a-zA-Z-]*[a-zA-Z]$/;
// or
var nameRegex = /^(?!-)(?!.*-$)[a-zA-Z-]+$/;

var nameRegex = /^(?!-)[a-zA-Z-]*[a-zA-Z]$/;
// or
var nameRegex1 = /^(?!-)(?!.*-$)[a-zA-Z-]+$/;

function validName(n) {
  if (n.match(nameRegex) == null) {
    return "Wrong";
  } else {
    return "Right";
  }
}

function validName1(n) {
  if (n.match(nameRegex1) == null) {
    return "Wrong";
  } else {
    return "Right";
  }
}

console.log(validName('abc'));
console.log(validName('abc-'));
console.log(validName('-abc'));
console.log(validName('-abc-'));
console.log(validName('a-b-c'));

console.log(validName1('abc'));
console.log(validName1('abc-'));
console.log(validName1('-abc'));
console.log(validName1('-abc-'));
console.log(validName1('a-b-c'));

Tájékoztatásul: Használhatod a RegExp#test metódust a regex-illeszkedés keresésére, amely logikai értéket ad vissza a regex-illeszkedés alapján.

if(nameRegex.test(n)){
  return "Right";
}
else{
  return "Wrong";
}


FRISSÍTÉS: Ha csak egyetlen opcionális --t szeretne a szavak között, használjon 0 vagy több ismétlődő csoportot, amelyek - karakterekkel kezdődnek, amint azt @WiktorStribiżew válaszában említettük.

var nameRegex = /^[a-zA-Z]+(?:-[a-zA-Z]+)*$/;

Válasz #2

Azt kell tenned, hogy a egy karakterosztályodat bontsd két részre, a kötőjelet tedd ki belőle, és használj egy csoportosító szerkezetet a kötőjel + alfanumerikus karakterek sorozatának egyezéséhez:

var nameRegex = /^[a-zA-Z]+(?:-[a-zA-Z]+)*$/;

Nézze meg a regex demót

Ez azonosítja az alfanumerikus karaktereket (1 vagy több) a string elején, majd 0 vagy több előfordulását a - + egy vagy több alfanumerikus karakter kombinációnak a string végéig.

Ha a karakterláncban csak 1 kötőjel lehet, cserélje le a * végét ?-re (lásd a regex demót).

Ha azt is engedélyezni szeretnéd, hogy szóköz legyen az alfanumerikus karakterek között, cseréld le a --t [\s-]-re (demo).