webForumDet fria alternativet

Hjälp Regex

.NET

8 svar · 347 visningar · startad av echoSwe

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

Tja!

Har den här metoden/funktionen:

public bool IsEmail(string strToCheck)
{
	Regex objEmailPattern = new Regex("^([\w-\.]+)@(([\w-]+\.)+)([a-zA-Z]{2,4})$");
	return !objEmailPattern.IsMatch(strToCheck);
}

Kompilatorn svarar:
"Unrecognized escape sequence"
i mitt reguljära uttryck.

Vad är fel, och skulle ni ha skrivit detta på något annat sätt?
Om jag förstår det rätt så borde min funktion returnera true till e-mail adressen:

mitt.namn@foretag.se
mitt.mellan.namn@foretag.se
mitt.namn@foretag.pub.se

eller?

//henke

Medlem sedan juli 20011 304 inlägg
#2

Såhär skulle jag göra:

public bool IsEmail(string strToCheck)
{
Regex r = new Regex(@"\w{1,}@\w{2,}\.\w{2,3}");
return r.IsMatch(strToCheck)
}

Mitt är kanske lite mindre noggrant än det du har. Är ingen regex expert men att börja med @ innan stängen brukar lösa problem med escape sequences :)

Medlem sedan nov. 20041 189 inlägg
#3

Ja, hehe, jag pillade med det ett par minuter nu, och kom på det :). Tack för svaret. Jag gillar din regex bättre än min, hehe, eftersom din funkar.

Har detta:

using System.Text.RegularExpressions;
using System;

namespace Henke
{
	/// <summary>
	/// Min validator, som ska kompletteras med fler funktioner
	/// </summary>
	public class Validator
	{
		
		public bool IsEmail(string strToCheck)
		{
			Regex r = new Regex(@"\w{1,}@\w{2,}\.\w{2,3}");
			return r.IsMatch(strToCheck);
		}
	}
}

Hur gör jag detta till en .dll fil som jag kan lägga i min bin-mapp (som i sin tur ligger i min applicationsmapp)?

Medlem sedan nov. 20041 189 inlägg
#4

Undrar en annan sak också, ett logiskt fel, som borde fungera enligt mig.

		string strChecker = checker.Text.ToLower();
		string[] strMyNames = new string[] { "henrik", "henke", "henrik feldt", "feldt" };
		for (int i = 0; i < strMyNames.Length; i++) {
			if (strChecker == strMyNames[i])
			{ 
				break;
			}
			else { lblResponse.Text = "Not my name."; return false; }
		}

Problemet är att om strChecker är henke så stoppas inte loopen. Den stoppas bara om strChecker är "henrik".

Lösning? :(

-------- EDIT:
Lösning:

		string strChecker = checker.Text.ToLower();
		string[] strMyNames = new string[] { "henrik", "henke", "henrik feldt", "feldt" };
		bool found = false;
		for (int i = 0; i < strMyNames.Length && !found; i++) {
			if (strChecker == strMyNames[i])
			{ 
				found = true;
				break;
			}
		}
		if (!found) { lblResponse.Text = "Not my name."; return false; }

Det var så att om rätt namn hittades så stoppades enbart if-satsen, inte loopen, vilket gjorde att nästa if-sats else-sats kördes, och funktionen retunerade false. =)

Medlem sedan sep. 20011 914 inlägg
#5

Annars kan du ju lägga in det i en egen liten funktion. Blev visst två versioner.

private void btCheck_Click(object sender, EventArgs e)
{
   if(!IsValidName(checker.Text.ToLower()) 
   { 
      lblResponse.Text = "Not my name."; 
      return;
   }
}

//Alt 1
private bool IsValidName(string name)
{
   string[] strMyNames = new string[] { "henrik", "henke", "henrik feldt", "feldt" };

   for(int i = 0; i < strMyNames.Length; i++) 
   {
      if (name == strMyNames[i])
          return true;
   }
   return false;
}

//Alt 2
private bool IsValidName(string name)
{
   string[] strMyNames = new string[] { "henrik", "henke", "henrik feldt", "feldt" };

   StringCollection sc = new StringCollection();
   sc.AddRange(strMyNames); //Kan ju även lägga in namnen via sc.Add("henke"); osv

   if(sc.Contains(name))
     return true;
   
   return false;
}
Medlem sedan nov. 20041 189 inlägg
#6

Ja, det var ett sätt som jag inte har sett förut - man kan väl kalla det abstraktion? Istället för att jag skriver loopen så gör
System.Collections.Specialized.StringCollection namnrymden det åt mig?
(du glömde en parantes i void btCheck_Click)

Jag lade till den andra varianten eftersom den är ny för mig :)... Har inte använt den namnrymden tidigare.

Men som jag sade tidigare: "Hur gör jag detta till en .dll fil som jag kan lägga i min bin-mapp (som i sin tur ligger i min applicationsmapp)?" - alltså valideringen av emailen?

Ni kan kolla på den här koden i arbete under https://www.swedendesign.tk --> guestbook.

Medlem sedan juli 20011 304 inlägg
#7

Använder du Visual studio?
I så fall:
Välj att skapa ett nytt projek -> Class library
Lägg din kod i en klass och kompilera så får du en dll.

Lägg till en referens från dina projekt som ska använda dll:en till din nya dll.

Du använder den sedan genom att instantiera den med MittnameSpace.MinKlass = variabelnamn new MittnameSpace.MinKlass();

variabelnamn.minMetod();

Vill du slippa skriva hela namespacet så skriver du
using MittNameSpace;

Om du kopierar över allt till en annan webbserver får du se till att dll:en ligger i Bin mappen

Medlem sedan nov. 20041 189 inlägg
#8

Tja, tack för svaret.

Det är just det - jag använder inte Visual Studio. Har något som heter SharpDevelop som det skrevs om i Datormagazin de senaste tre nummerna... Lyckas inte riktigt få det att fungera där...

Men det är en sak som inte riktigt stämmer med hur du säger att man ska instansiera den:
MittnameSpace.MinKlass = variabelnamn new MittnameSpace.MinKlass();

ska det inte vara

MittNamespace.MinKlass mittObjekt = new MittNamespace.MinKlass.Konstruktor();

eller om man lägger till "using Namespace;":
MinKlass objMittObjekt = new Konstruktor();
(sen är ju självklart konstruktorn oftast kallad samma sak som klassen)

sedan
objMittObjekt.Metod();

Men finns det inget annat sätt att kompilera filerna då, än att använda MS VisualStudio?

//henke

Medlem sedan juli 20011 304 inlägg
#9

Men det är en sak som inte riktigt stämmer med hur du säger att man ska instansiera den:
MittnameSpace.MinKlass = variabelnamn new MittnameSpace.MinKlass();

Självklart ska det vara så. Skrivfel av mig!

Du kan kompilera från promten om du vill - inga problem.

för c# använder du kommandot csc

För att skapa ett library:

csc /target:library /out:myLibrary.dll myFile.cs

För att skapa en exe som refererar till detta lirbary

csc /reference:myLibrary.dll MyFile2.cs

Alla kommandon är tagna ur huvudet så fel kan förkomma. Google är din vän i dessa sammanhang :)

Men jag är ganska säker på att du kan kompilera i sharpdevelop, du kanske måste ändra target till library eller nåt sånt i projektet. Har tyvärr inte använt sharpdevelop så jag vet inte riktigt hur det fungerar där...

260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)