.NET-regex-spezifisch .net C# dataannotations
Ich habe einen regulären Ausdruck, der ich versuche, herauszufinden, für eine .NETTO-Daten Anmerkung Validierungs-Modell, das ich verwende. Aktuell sieht es so aus
[RegularExpression("^((?!City)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")]
Der ersten Hälfte dieses regex um die Stadt, die zweite Hälfte ist zu stellen Sie sicher sein, nur Buchstaben und Leerzeichen.
Den default-Wert für den input-text-Feld ist die Stadt, also einfach nur "Stadt" cant pass validation. Ich kann nicht scheinen, um den ersten Teil der regex, diese Fälle passieren.
Cityville
City City
Jersey City
Arizona City
Aber in diesem Fall nicht passieren:
City
Jegliche Hilfe würde sehr geschätzt werden.
*BEARBEITEN*
Dieses Tat der trick:
^((?!^City$)[a-zA-Z '])+$
Ich aktualisiert, alle meine Validierung, um diese aufzunehmen. Nur für den Fall Sie möchten, um zu sehen, was ich mache. Hier wird der code für die gesamte Validierung Daten-Modell, das ich verwende. (aktualisiert mit den richtigen regex)
public class FormModel {
[Required(ErrorMessage = "First Name is a Required field.")]
[DataType(DataType.Text)]
[Display(Order = 1, Name = "FirstName")]
[RegularExpression("^((?!^First Name$)[a-zA-Z '])+$", ErrorMessage = "First name is required and must be properly formatted.")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Last Name is a Required field.")]
[DataType(DataType.Text)]
[Display(Order = 2, Name = "LastName")]
[RegularExpression("^((?!^Last Name$)[a-zA-Z '])+$", ErrorMessage = "Last name is required and must be properly formatted.")]
public string LastName { get; set; }
[Required(ErrorMessage = "Address is a Required field.")]
[DataType(DataType.Text)]
[Display(Order = 3, Name = "Address")]
[RegularExpression("^((?!^Address$)[0-9A-Za-z #.,])+$", ErrorMessage = "Address is required and must be properly formatted.")]
public string Address { get; set; }
[DataType(DataType.Text)]
[Display(Order = 4, Name = "Address2")]
public string Address2 { get; set; }
[Required(ErrorMessage = "City is a Required field.")]
[DataType(DataType.Text)]
[RegularExpression("^((?!^City$)[a-zA-Z '])+$", ErrorMessage = "City is required and must be properly formatted.")]
[Display(Order = 6, Name = "City")]
public string City { get; set; }
[Required( ErrorMessage = "State is a Required field." )]
[DataType( DataType.Text )]
[Display( Order = 7, Name = "State" )]
public IEnumerable<String> State { get; set; }
[Required( ErrorMessage = "Zip is a Required field." )]
[DataType( DataType.Text )]
[RegularExpression( "\\d{5}",
ErrorMessage = "Zip Code is required and must be properly formatted.")]
[Display( Order = 8, Name = "Zip" )]
public String Zip { get; set; }
[Required( ErrorMessage = "Phone is a Required field." )]
[DataType( DataType.PhoneNumber )]
[RegularExpression( "^[01]?[- .]?\\(?[2-9]\\d{2}\\)?[- .]?\\d{3}[- .]?\\d{4}$",
ErrorMessage = "Phone is required and must be properly formatted.")]
[Display( Order = 9, Name = "Phone" )]
public string Phone { get; set; }
[Required( ErrorMessage = "Email is a Required field." )]
[DataType( DataType.EmailAddress )]
[RegularExpression( "^[A-Za-z0-9._%+-]*@[A-Za-z0-9.-]*\\.[A-Za-z0-9-]{2,}$",
ErrorMessage = "Email is required and must be properly formatted.")]
[Display( Order = 10, Name = "Email" )]
public string Email { get; set; }
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese für den regulären Ausdruck
^((?!^City$)[a-zA-Z '])+$
Um eine negative Prüfung für "Stadt", habe ich Hinzugefügt, ein Anfang (^) & end - ( $ ) - Zeichen an die Stadt.
Ich habe es getestet bei http://regex101.com/r/bF4bZ3 und es scheint zu funktionieren, wenn ich Verständnis für die Forderung richtig.
Andere Antworten gegeben haben, die helfen, mit dem regulären Ausdruck, den Sie angefordert. Ich werde Kommentar auf einen etwas anderen Aspekt - der default-Wert sollte etwas sinnvolles oder gar nichts ("Stadt", ist eine schlechte default-Wert).
Was Sie wohl tun wollte, war, legen Sie Platzhalter-text, der verschwindet, sobald du in das Textfeld ein. Sie können dies tun, mit der Prompt Eigenschaft von Anzeigen - Attribut, wenn Sie NET 4.5 - siehe diese Antwort für details.
Nicht mit einem gefälschten default-Wert bedeutet, können Sie einfach
[Required]
und die Benutzer brauchen, etwas zu geben, und verhindert, dass Sie benötigen, um zu verfolgen, was Ihre fake sind default-Werte.Einfach zu werfen, ein weiterer Schraubenschlüssel in den Werken, "die Stadt" ist ein gültigen Platz name - es gibt zwei Dörfer namens City in Wales und ein Bereich, in Zürich!
(?!City)
bedeutetCity
Zero-Width Negative Lookahead, also^((?!City)[a-zA-Z '])+$
bedeutet:City
Hier ist, wie zu verbieten
City
:Demo
Dies ist eigentlich eine wirklich kleine Fehler auf Ihrer Seite. Ändern Sie Ihre Regex zu:
Und Sie werden den gewünschten Effekt haben. Im Grunde das + bedeutet ein oder mehrere Male, und da hattest du den GESAMTEN Ausdruck in Klammern, die auftreten ein oder mehrere Male, es würde der "Stadt" entspricht an jedem Punkt im string... Das sagt statt, in Englisch: Nicht "Stadt", und Buchstaben und Leerzeichen oder einfachen Anführungszeichen, ein oder mehrere Male.
Ein gutes Werkzeug zum testen von Regex Regex Held: http://regexhero.net/tester
City City
. Sie brauchen eine$
in die Zukunft schauen, um sicherzustellen, es ist nicht alles, was nach der Stadt.Negativen matching in regulären Ausdrücken ist generell eine schlechte Idee, es ist einfach nicht so konzipiert,. Die beste Methode wäre, um zu überprüfen gegen:
Annulliere den test. In diesem Fall, Sie haben nicht wirklich eine option, das zu tun.
Sind Sie wirklich in der Nähe, Sie brauchen nur zu bewegen Ihre Anker in den negativen lookahead, und geben Sie die Zeichenfolge ein min Länge.
Diesem match alles, was 4 Zeichen oder mehr, dass ist nicht "Stadt".
Ohne die minimale Länge der "ity" in "Stadt" wird ein Spiel, das wird Ihnen nicht helfen.
Reduzieren Sie die minimale Länge auf 3, indem Sie einen Blick hinter sich, wenn Sie mögen.