webForumDet fria alternativet

RegExp: Tillåt bara siffror och bokstäver

ASP

13 svar · 1 240 visningar · startad av Sasch

Medlem sedan nov. 2002830 inlägg
Frågan#1

Tänkte göra en koll på användarnamn och lösenord så dessa bara klarar av att mecka in bokstäver (A-z)(0-9) till databasen (alltså, "&" och alla andra konstiga tecken ska generera ett fel (False))...

Men jag har en känsla att min RegExp inte är speciellt sammarbetsam i det läget:

 Function isValidName(myUserName)
  dim isValidU, regEx ' ## A-z 0-9 only
  
  isValidU = True
  SET regEx = New RegExp
  regEx.IgnoreCase = False
  regEx.Pattern = "^[a-zA-Z]*[a-zA-Z0-9]$"
  isValidU = regEx.Test(myUserName)
  
  isValidName = isValidU
 End Function

Vad jag läst mig till är att "$" förväntar sig att det ska fortsätta efter eller att det är sluttecknet det mönstret gäller, stämmer det eller har jag fått det helt om bakfoten?

Medlem sedan aug. 20039 340 inlägg
#2

^ markerar början av strängen och $ slutet.
Jag tror den regex du vill ha är: "^[a-z][a-z0-9]*$"
Den gör att bara siffror och bokstäver tillåts, men att användarnamn inte får börja med en siffra.
Som du hade skrivit den så matchade den ett godtyckligt antal bokstäver, men tillåter endast sista tecknet att vara en siffra.
Dessutom har jag som du ser tagit bort A-Z ur uttrycken, och det kräver att du ändrar raden ovanför till: regEx.IgnoreCase = True
jag ser ingen som helst anledning att i ditt fall sätta IgnoreCase till False.

Medlem sedan juni 20019 519 inlägg
#3

Som nitro2k01 skriver.. du kan även korta ner den lite mer:

^[a-z][a-z\d]*$

Om jag hade varit dig så hade jag nog skrivit om koden lite... du sätter värdet som "true" som default. Man ska nog aldrig vara så "god" mot användaren att man förväntar sig att dom skriver rätt. Du kan även låta den retunera regEx test värdet direkt till "isValidName":

Function isValidName(myUserName)
	With New RegExp
		.IgnoreCase = False
		.Pattern = "^[a-z][a-z\d]*$"
		isValidName = .Test(myUserName))
	End With
End Function
Medlem sedan aug. 2002733 inlägg
#4

En fråga, varför har ni med [a-z] och [a-z\d]?

Medlem sedan juni 20019 519 inlägg
#5

[] kapslar in en "range" på vad som skall träffas.
Träffar ett något av teckna i listan nedan:
Ett Tecken mellan a-z
ett nummer 0-9

och varför [a-z][a-z\d]* är enkla anledningen att användar namnen måste (oftast i alla fall) börja på en bokstav.

Medlem sedan nov. 2002830 inlägg
#6

Så om man vill att ett namn kan börja med en siffra så räcker det alltså med "[a-z\d]*"?

Om man vill vara så godtycklig att låta användaren använda underscore och bindestreck, hur blir det då? Något i denna stilen?

[a-z][a-z_-\d]*"

Tror det gick att göra så här om man använde nitro2k01 mönster (Eller blir det väldigt fel då?);

^[a-z][a-z0-9_-]*$
Medlem sedan sep. 20005 700 inlägg
#7

Sasch skrev:

Så om man vill att ett namn kan börja med en siffra så räcker det alltså med "[a-z\d]*"?

red/ Läste fel. Ja, det räcker så då: ^[a-z\d]*$

Sasch skrev:

Om man vill vara så godtycklig att låta användaren använda underscore och bindestreck, hur blir det då? Något i denna stilen?

[a-z][a-z_-\d]*"

Tror det gick att göra så här om man använde nitro2k01 mönster (Eller blir det väldigt fel då?);

^[a-z][a-z0-9_-]*$

- är ju en operator inom [], nu är det möjligt att det fungerar iaf eftersom du har satt bindestrecket sist men för att vara på den säkra sidan bör du escape:a det tecknet:
^[a-z][a-z0-9_\-]*$
^[a-z][a-z_\-\d]*$ borde också fungera.

Medlem sedan nov. 2002830 inlägg
#8

Tusen tack för alla bra svar hörni :bire

Medlem sedan aug. 20039 340 inlägg
#9

Jag hävdar att ^[a-z\d]*$ bör vara ^[a-z\d]+$
Den förstnämnda släpper nämligen även igenom en tom sträng.

Medlem sedan sep. 20005 700 inlägg
#10

nitro2k01 skrev:

Jag hävdar att ^[a-z\d]*$ bör vara ^[a-z\d]+$
Den förstnämnda släpper nämligen även igenom en tom sträng.

Bra noterat!

Medlem sedan juni 20019 519 inlägg
#11

Sasch skrev:

Tror det gick att göra så här om man använde nitro2k01 mönster (Eller blir det väldigt fel då?);

Nej.. det blir inte fel.. men varför inte använda \d som uppfyller dina krav istället för att göra en "range" av nummer...

Medlem sedan nov. 2002830 inlägg
#12

voigtann1 skrev:

Nej.. det blir inte fel.. men varför inte använda \d som uppfyller dina krav istället för att göra en "range" av nummer...

Eftersom jag inte lärt mig \d riktigt när jag frågade och enbart läst om den andra så tedde det sig lättare att fråga om den andra ;), Men det jag använder nu ser alltså ut så här, vilket dessutom fungerar utmärkt;

 Function isValidName(myUserName)
 ' ### Kontrollerar användarnamn, Only A-z 0-9 _ -
	With New RegExp
		.IgnoreCase = True
		.Pattern = "^[a-z][a-z_\-\d]+$"
		isValidName = .Test(myUserName)
	End With
 End Function
Medlem sedan sep. 20005 700 inlägg
#13

voigtann1 skrev:

Nej.. det blir inte fel.. men varför inte använda \d som uppfyller dina krav istället för att göra en "range" av nummer...

Finns det något som säger att \d är överlägsen 0-9 prestandamässigt?
(Beror väl troligtvis på implementationen)

Medlem sedan juni 20019 519 inlägg
#14

Inte vad jag vet... men anser att det är bättre att använda \d än 0-9.. det är ju trots allt bättre att använda a-z istället för abcdefgh.... men 0-9 och \d är samma sak. Vad jag vet så är det ingen direkt prestanda ökning eller minskning.

266 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)